2017-10-09 201 views
-1

我正在从触发器调用过程并将某些参数从触发器传递到过程。参数是:使用sp_executesql执行时,SQL Server语法异常不正确

@table_name varchar(128), @where_str varchar(200) 

在过程中,我执行的命令为sp_executesql。我想,我使用的语法不正确,但我找不到解决方案。

这是所执行的查询:

SET @SqlString = N'update @ptable_name set RepSt=2 @pwhere_str'; 
    SET @ParmDefinition = N'@ptable_name varchar(128), @pwhere_str varchar(200)'; 

    execute sp_executesql @SqlString, @ParmDefinition, 
         @ptable_name = @table_name, @pwhere_str = @where_str; 

传递的参数是这样的:

+0

不知何故,神奇地,我们会知道什么值被发送到这些参数?没有参数值就无法检查语法。 –

+0

@Used_By_Already我按照你的要求更新了问题。 – Tunahan

回答

0

你最终执行的是一样的东西:

DECLARE @ptable_name VARCHAR(128) = 'your_Table' 
,  @pwhere_str VARCHAR(200) = 'Your_where_clause' 

UPDATE @ptable_name 
SET  RepSt=2 
WHERE @pwhere_str 

这是不行的,你需要更换可变执行的SQL:

SET @SqlString = N'update @ptable_name set RepSt=2 @pwhere_str'; 
SET @SqlString = REPLACE(REPLACE(@SqlString, '@ptable_name', @table_name), '@pwhere_str', @where_str) 

execute sp_executesql @SqlString 

(非常脏,但这是主意。)

+0

我正在使用这个解决方案,我想感谢你。为了在concatanated sql字符串中使用int变量,替换是一个挽救生命的解决方案。 – Tunahan

0

SET @SQLString = N'update' + @ptable_name +'set RepSt = 2 @pwhere_str';

+0

这不起作用。当你在这个set子句之前声明@ptable_name时,它就起作用了。 – Tunahan