54
create procedure sp_First
@columnname varchar
AS
begin
select @columnname from Table_1
end 
exec sp_First 'sname'

私の要件は、列名を入力パラメーターとして渡すことです。私はそのように試みましたが、間違った出力を出しました。

だから助けて

4

9 に答える 9

75

これはいくつかの方法で行うことができます。

1 つは、自分でクエリを作成して実行することです。

SET @sql = 'SELECT ' + @columnName + ' FROM yourTable'
sp_executesql @sql

その方法を選択する場合は、入力を確実に消毒してください。アプリケーションが「実際の」列名しか与えないことを知っていても、誰かがセキュリティに亀裂を見つけて SP を直接実行できるとしたら? その後、彼らは好きなことを何でも実行できます。動的 SQL では、常に、常に、パラメーターを検証します。

または、CASEステートメントを書くことができます...

SELECT
  CASE @columnName
    WHEN 'Col1' THEN Col1
    WHEN 'Col2' THEN Col2
                ELSE NULL
  END as selectedColumn
FROM
  yourTable

これは少し長くなりますが、はるかに安全です。

于 2012-04-10T16:50:24.707 に答える
13

いいえ、それはパラメータ値を選択するだけです。動的SQLを使用する必要があります。

手順では、次のようになります。

DECLARE @sql nvarchar(max) = 'SELECT ' + @columnname + ' FROM Table_1';
exec sp_executesql @sql, N''
于 2012-04-10T16:47:48.523 に答える
10

動的 SQL を使用してみてください。

create procedure sp_First @columnname varchar 
AS 
begin 
    declare @sql nvarchar(4000);
    set @sql='select ['+@columnname+'] from Table_1';
    exec sp_executesql @sql
end 
go

exec sp_First 'sname'
go
于 2012-04-10T16:50:01.337 に答える
6

これは不可能です。動的 SQL (危険) または巨大なケース式 (遅い) を使用してください。

于 2012-04-10T16:46:55.480 に答える
2
   Create PROCEDURE USP_S_NameAvilability
     (@Value VARCHAR(50)=null,
      @TableName VARCHAR(50)=null,
      @ColumnName VARCHAR(50)=null)
        AS
        BEGIN
        DECLARE @cmd AS NVARCHAR(max)
        SET @Value = ''''+@Value+ ''''
        SET @cmd = N'SELECT * FROM ' + @TableName + ' WHERE ' +  @ColumnName + ' = ' + @Value
        EXEC(@cmd)
      END

答えの1つを試したので、正常に実行されていますが、実行中に正しい出力が得られないため、上記はうまく機能します

于 2013-03-05T06:09:58.983 に答える
1

列名を渡すことはできますが、次のようなSQLステートメントでは使用できません

Select @Columnname From Table

動的なSQL文字列を作成して、次のように実行できますEXEC (@SQL)

詳細については、動的 SQL に関するこの回答を参照してください。

動的 SQL の長所と短所

于 2012-04-10T16:48:13.423 に答える
-3

これで試してみてください。うまくいくことを願っています。

Create Procedure Test
(
    @Table VARCHAR(500),
    @Column VARCHAR(100),
    @Value  VARCHAR(300)
)
AS
BEGIN

DECLARE @sql nvarchar(1000)

SET @sql = 'SELECT * FROM ' + @Table + ' WHERE ' + @Column + ' = ' + @Value

--SELECT @sql
exec (@sql)

END

-----execution----

/** Exec Test Products,IsDeposit,1 **/
于 2013-01-17T10:06:16.513 に答える