3

次のコードを実行しようとするとエラーが発生します。同様の解決策を探しましたが、わかりません。

DECLARE @TAB_COL_NAME TABLE(idx int identity(1,1), COLUMNNAME VARCHAR(MAX))
DECLARE @TEMPLATE_NAME NVARCHAR(50)
SET @TEMPLATE_NAME = 'MYTABLE1'
INSERT INTO @TAB_COL_NAME EXEC('SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '+@TEMPLATE_NAME)

sp_executesql,使ってみようという声が多かったので試してみましたがsp_executesql

  DECLARE @SQL NVARCHAR(100)
  DECLARE @TEMPLATE_NAM NVARCHAR(50)
  SET @TEMPLATE_NAM = 'MYTABLE1'
  SET @SQL = N'SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '+ '@TEMPLATE_NAME'
 EXEC sp_executesql @SQL,
                   '@TEMPLATE_NAME Nvarchar(50)',
                    @TEMPLATE_NAME = @TEMPLATE_NAM

そして、これはエラーを出します:Procedure expects parameter '@parameters' of type 'ntext/nchar/nvarchar'.

これに対する正しい解決策は何ですか?

私はこれを達成できませんEXEC SQLか?

いくつかの返信が役に立ちます。

4

3 に答える 3

2

なぜ変数を渡そうとしているのですか?あなたの場合、そうする義務はありません。連結を使用して次のことを試してください。

DECLARE @SQL NVARCHAR(100)
  DECLARE @TEMPLATE_NAME NVARCHAR(50)
  SET @TEMPLATE_NAME = 'マイテーブル'
  SET @SQL = N'SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '''+ @TEMPLATE_NAME + ''''
  出力@SQL
 EXEC sp_executesql @SQL

ただし、パラメーター化する必要がある場合は、次の方法で sp_executesql を使用できます。

DECLARE @SQL NVARCHAR(100)
  DECLARE @TEMPLATE_NAME NVARCHAR(50)
  SET @TEMPLATE_NAME = 'mytable';
  SET @SQL = N'SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @TEMPLATE_NAME';
 EXEC sp_executesql @SQL 、N'@TEMPLATE_NAME NVARCHAR(50)'、@TEMPLATE_NAME
于 2013-07-16T10:37:54.600 に答える
1

この例では発生しませんが、sp_executesql文字列を連結して実行するために使用されるメソッドは、SQL インジェクションの対象となります。この回答では、パラメーターを適切に使用しています。パラメータ 2 は文字列に渡すパラメータを定義し、3+ は渡すパラメータです。

また、アポストロフィを含むパラメーターがある場合、連結されたバージョン: で失敗します SET @TEMPLATE_NAME = '[MYTABLE''1]';。この場合はあまり現実的ではありませんが、一般的に動的 SQL を使用する場合は注意が必要です。

 DECLARE @SQL NVARCHAR(100);
  DECLARE @TEMPLATE_NAME NVARCHAR(50);
  SET @TEMPLATE_NAME = 'MYTABLE1';
  SET @SQL = N'SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @TEMPLATE_NAME';
 EXEC sp_executesql @SQL , N'@TEMPLATE_NAME NVARCHAR(50)',  @TEMPLATE_NAME;

ブログ: 動的 SQL と SQL インジェクション

于 2013-07-16T10:41:23.520 に答える
1

sp_executesql の 2 番目のパラメーターに N を追加して、定数 nvarchar を作成します。

EXEC sp_executesql @SQL,
               N'@TEMPLATE_NAME Nvarchar(50)',
                @TEMPLATE_NAME = @TEMPLATE_NAM
于 2013-07-16T10:37:31.223 に答える