动态 SQL 参数错误,'@myparametername'附近语法不正确



我正在构建一个有趣的存储过程,该过程将使用Dynamic SQL,SP_EXECUTESQL带有参数,以允许所有数据库表中的所有数据库表中的列的某些更改语句(如您所需的那样)看到我使用一个光标循环DB上的所有表格)

我构建了一个测试,但是参数不起作用,我在每个Alter表语句上都会获得下一个错误

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的@seanlange选项,并进行了一些修改
SET @sqlCommand =Replace(@sqlCommand, '@parTablename',QUOTENAME(@tablename))
EXECUTE sp_executesql @sqlCommand

您不能像这样的动态SQL的中间粘贴一个参数。您需要使用打印而不是执行来调试此问题。我本人不会使用光标,但是如果您走那条路,您将必须在执行语句之前做这样的事情。

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

相关内容

  • 没有找到相关文章

最新更新