我正在尝试使用一个参数创建存储过程。我希望存储过程执行更新查询,并且我执行时传递的参数是应该更新的表。我使用参数创建过程失败了。
CREATE PROCEDURE cleanq7 @tablename varchar(100)
AS
BEGIN
UPDATE @tablename
SET IMPOSSIBLE_CASE = '1'
WHERE q7='1'
GO
我运行时收到的消息是:
Msg 102, Level 15, State 1, Procedure cleanq7, Line 6
Incorrect syntax near '1'.
我在测试数据库中的表上尝试了缩进的更新查询,并且它按预期运行,所以我想这是我声明存储过程的语法问题。
非常感谢任何帮助!
答案 0 :(得分:6)
CREATE PROCEDURE cleanq7
@tablename NVARCHAR(128)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @Sql NVARCHAR(MAX);
SET @Sql = N'UPDATE ' + QUOTENAME(@tablename) +
N' SET IMPOSSIBLE_CASE = ''1''
WHERE q7 = ''1'''
EXECUTE sp_executesql @Sql
END
GO
由于您传递的是表名,因此需要动态构建UPDATE语句,然后使用系统存储过程sp_executesql
执行它。
将表名称作为字符串传递时,Sql Server将其视为字符串而不是对象名称。使用 QUOTENAME()
函数在传递的表名周围放置方括号[]
,然后sql server将其视为对象名。
QuoteName函数还可以保护您免受Sql注入攻击。