T-SQL使用变量作为表名

时间:2018-09-26 21:45:41

标签: sql-server tsql stored-procedures ssms

我正在尝试将SSMS中的多个存储过程压缩为一个。所有过程在功能上都非常相似:浏览一个表并将给定字段的值更改为给定变量。程序之间的唯一真正区别是其中引用的表和字段。

基于SO上的其他帖子,我提出了以下建议:

DECLARE @strQuery NVARCHAR(500)

SET @strQuery = 
    'UPDATE ' + @strTableName + 
    ' SET ' + @strField + ' = ' + @strNewFieldValue + 
    ' WHERE primaryKey = ' + CAST(@intNumber AS NVARCHAR(50));

EXECUTE @strQuery

但是,当我尝试运行它时,出现以下错误:

  

找不到存储过程'UPDATE dbo.tableName SET dbo.Field = NewFieldValue WHERE pri

这是我想在最后一点被截断的情况下运行的查询。更改@strQuery变量的大小对错误消息的长度没有影响。有什么我想念的吗?

3 个答案:

答案 0 :(得分:3)

使用sp_execute_sql。以及参数:

DECLARE @strQuery NVARCHAR(MAX);

SET @strQuery = '
UPDATE ' + strTableName + '
    SET ' + @strField + ' = @strNewFieldValue 
    WHERE primaryKey = @intNumber';

EXEC sp_executesql @strQuery,
                   N'@strNewFieldValue varchar(255), @intNumber int',
                   @strNewFieldValue=@strNewFieldValue, @intNumber=@intNumber;

请注意,文字值已替换为参数。即使SQL注入不是问题,这也可以简化查询并确保值中的奇数字符不会不适当地影响查询。

此外,SQL Server允许字符串跨行。因此,我使用该功能删除了一些单引号。

答案 1 :(得分:1)

答案 2 :(得分:0)

尝试

EXECUTE (@strQuery)

请参见docs,并注意“执行字符串”的语法中的括号。如果没有括号,SQL Server会认为您要执行存储过程。