2016-06-22 4 views
0

動的SQLを使用するストアドプロシージャsp_executesqlをパラメータとともに使用して、列名が存在する場合、 (DB上のあなたが見ることができるように、私はループのカーソルを使用するすべてのテーブル)動的SQLパラメータエラー、 '@myparametername'の近くにある構文が正しくありません

は、私がテストを構築しましたが、パラメータが、私は

Msg 102, Level 15, State 1, Line 1 
Incorrect syntax near '@parTablename'. 
を実行する各ALTER TABLE文で次のエラーを取得し、機能しません。

次はコード

SET NOCOUNT ON; 
GO 
DECLARE @tablename varchar(100); 
DECLARE @alteredColumn varchar(100)='[mycolumn] [datetimeoffset](0) NOT NULL;'; 
DECLARE @column varchar(100)='mycolumn'; 
DECLARE @parDefinition nvarchar(500) = N'@parTablename nvarchar(100)'; 
DECLARE @sqlCommand nvarchar(1000)= N'ALTER TABLE @parTablename ALTER COLUMN '[email protected]; 

DECLARE ALTERCURSOR CURSOR LOCAL FAST_FORWARD FOR 
    SELECT name AS tablename 
    FROM sys.Tables 

OPEN ALTERCURSOR; 
FETCH NEXT FROM ALTERCURSOR INTO @tablename 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    --print @tablename 
    IF EXISTS(SELECT * 
     FROM INFORMATION_SCHEMA.COLUMNS 
     WHERE TABLE_NAME = @tablename AND COLUMN_NAME = @column) 
    BEGIN 
     EXECUTE sp_executesql @sqlCommand, @parDefinition,@parTablename = @tablename 
    END 
    FETCH NEXT FROM ALTERCURSOR INTO @tablename 
END 
CLOSE ALTERCURSOR; 
DEALLOCATE ALTERCURSOR; 
SET NOCOUNT OFF; 
GO 

SOLUTION
はどうやらその代わりに、私は少し修正
SET @sqlCommand =Replace(@sqlCommand, '@parTablename',QUOTENAME(@tablename))
EXECUTE sp_executesql @sqlCommand

+0

私は「PRINTの@parTablename」にSQLコマンドの変数を置き換え、私はすべてのテーブル名を見ることができます '@partablename = @tablename何ALTER文 –

+0

では動作しない理由、私は得ることはありません'のために? @partablenameはどこに定義されていますか?あなたはそれの定義を含む文字列を持っていますが、その文字列は決して実行されません。 ' そして、ここで使用される。 –

+0

は' @partablename = @tablename ' 'parTablenameのNVARCHAR(100)@'' @の 'DECLAREの@parDefinitionのNVARCHAR(500) ここで定義されpartablename' = Nの値を設定するために使用されます 'EXECUTE sp_executesql @sqlCommand、@ parDefinition、@ parTablename = @ tablename' @Marcドキュメントを確認してください。)[link](https://msdn.microsoft.com/en-us/library/ms188001.aspx) ** '@ tablename'がカーソルに設定されていることに注意してください。** –

答えて

0

あなたはパラメータを固執することはできませんとdegubため@SeanLangeオプションを使用し、パラメータとしてテーブル名を送信することはできませんあなたの動的SQLの中でこのように。これをデバッグするには、EXECUTEではなくPRINTを使用する必要があります。私は自分自身でカーソルを使用しませんが、もしあなたがそのパスに行くなら、EXECUTEステートメントの前にこのようなことをしなければなりません。

Set @sqlCommand = Replace(sqlCommand, '@parTablename', @parTablename) 
+0

'@sqlCommand = Replace(@sqlCommand、 '@parTablename'、@tablename)'はい、私はそれを行い、ALTER文は問題ありません。なぜこのようなパラメータを使うことができないのですか?そのドキュメントは可能です –

+0

まあ私はそれを得た、私は@SeanLangeオプションを選択する前に、テーブルを文字列を構築することがパラメータ化することはできません:)感謝の男 –

関連する問題