smk*_*081 1 t-sql sql-server stored-procedures
我试图用一个参数创建一个存储过程.我希望存储过程执行更新查询,并且我执行时传递的参数是应该更新的表.我使用参数创建过程失败了.
CREATE PROCEDURE cleanq7 @tablename varchar(100)
AS
BEGIN
UPDATE @tablename
SET IMPOSSIBLE_CASE = '1'
WHERE q7='1'
GO
Run Code Online (Sandbox Code Playgroud)
我运行时收到的消息是:
Msg 102, Level 15, State 1, Procedure cleanq7, Line 6
Incorrect syntax near '1'.
Run Code Online (Sandbox Code Playgroud)
我在测试数据库中的表上尝试了缩进的更新查询,并且它按预期运行,所以我想这是我的语法用于声明存储过程的问题.
任何帮助将不胜感激!
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
Run Code Online (Sandbox Code Playgroud)
由于您传递的是表名,因此需要动态构建UPDATE语句,然后使用系统存储过程执行它sp_executesql.
将表名称作为字符串传递时,Sql Server将其视为字符串而不是对象名称.使用QUOTENAME()函数[]在传递的表名周围放置方括号,然后sql server将其视为对象名.
QuoteName函数还可以保护您免受Sql注入攻击.