动态 SQL 参数错误,“@myparametername”附近的语法不正确
Dynamic SQL parameter error, Incorrect syntax near '@myparametername'
我正在构建一个有趣的存储过程,它将使用带参数的动态 SQL、sp_executesql,以允许对所有数据库 table 中的列进行一些更改语句,如果列名存在(如您所见,我使用游标循环了数据库上的所有 table)
我构建了一个测试,但参数不起作用,我在运行的每个 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
解决方案
显然不可能发送一个 table 名称作为参数,而不是我使用 @SeanLange 选项进行 degub 稍作修改
SET @sqlCommand =Replace(@sqlCommand, '@parTablename',QUOTENAME(@tablename))<br>
执行 sp_executesql @sqlCommand
您不能像这样在动态 sql 中间添加参数。您需要使用 PRINT 而不是 EXECUTE 来调试它。我自己不会为此使用游标,但如果你走那条路,你将不得不在 EXECUTE 语句之前做这样的事情。
Set @sqlCommand = Replace(sqlCommand, '@parTablename', @parTablename)
我正在构建一个有趣的存储过程,它将使用带参数的动态 SQL、sp_executesql,以允许对所有数据库 table 中的列进行一些更改语句,如果列名存在(如您所见,我使用游标循环了数据库上的所有 table)
我构建了一个测试,但参数不起作用,我在运行的每个 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
解决方案
显然不可能发送一个 table 名称作为参数,而不是我使用 @SeanLange 选项进行 degub 稍作修改
SET @sqlCommand =Replace(@sqlCommand, '@parTablename',QUOTENAME(@tablename))<br>
执行 sp_executesql @sqlCommand
您不能像这样在动态 sql 中间添加参数。您需要使用 PRINT 而不是 EXECUTE 来调试它。我自己不会为此使用游标,但如果你走那条路,你将不得不在 EXECUTE 语句之前做这样的事情。
Set @sqlCommand = Replace(sqlCommand, '@parTablename', @parTablename)