SQL Server存储过程参数

时间:2014-02-09 22:29:40

标签: sql-server tsql stored-procedures

我正在尝试使用一个参数创建存储过程。我希望存储过程执行更新查询,并且我执行时传递的参数是应该更新的表。我使用参数创建过程失败了。

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'.

我在测试数据库中的表上尝试了缩进的更新查询,并且它按预期运行,所以我想这是我声明存储过程的语法问题。

非常感谢任何帮助!

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注入攻击。