我正在尝试将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
变量的大小对错误消息的长度没有影响。有什么我想念的吗?
答案 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)
尝试改用 sp_executesql
答案 2 :(得分:0)