动态SQL参数错误,'@myparametername'

时间:2016-06-22 16:39:48

标签: sql-server dynamic-sql sp-executesql

我正在构建一个有趣的存储过程,它将使用带有参数的动态SQL,sp_executesql,如果列名存在,则允许所有数据库表中的列的某些alter语句(如您所见,我使用了一个游标来循环所有DB上的表格

我构建了一个测试,但参数不起作用,我在每个运行的alter table语句中得到下一个错误

Msg 102, Level 15, State 1, Line 1
Incorrect syntax near '@parTablename'.

接下来是代码

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 '+@alteredColumn;

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


显然不可能将表名作为参数发送,而不是我使用@SeanLange选项对degub进行一点修改 SET @sqlCommand =Replace(@sqlCommand, '@parTablename',QUOTENAME(@tablename))
EXECUTE sp_executesql @sqlCommand

1 个答案:

答案 0 :(得分:0)

你不能像这样在动态sql的中间插入一个参数。您需要使用PRINT而不是EXECUTE来调试它。我不会自己使用游标,但如果你走这条路,你必须在EXECUTE语句之前做这样的事情。

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