動的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
私は「PRINTの@parTablename」にSQLコマンドの変数を置き換え、私はすべてのテーブル名を見ることができます '@partablename = @tablename何ALTER文 –
では動作しない理由、私は得ることはありません'のために? @partablenameはどこに定義されていますか?あなたはそれの定義を含む文字列を持っていますが、その文字列は決して実行されません。 ' そして、ここで使用される。 –
は' @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'がカーソルに設定されていることに注意してください。** –