2014-02-09 114 views
1

我试图用一个参数创建一个存储过程。我希望存储过程执行更新查询,并在执行时传递的参数是应更新的表。用参数创建过程我一直不成功。SQL Server存储过程参数

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

我认为你应该有一个END而不是GO。 – Mihai

+0

您需要使用动态SQL,因为不允许使用UPDATE @ variable' –

回答

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

+5

+1使用QUOTENAME() – DeanOC