【问题标题】:Dynamic sql is truncated with exec attempted动态 sql 被 exec 尝试截断
【发布时间】:2019-08-28 15:32:52
【问题描述】:

这是我的 SP:

alter PROCEDURE [dbo].[_spwf_Deps](@process_name varchar(64), @deps varchar(250))
AS
BEGIN

DECLARE @loop varchar(max);

SET @deps = REPLACE(@deps, ',', '= 1 AND ');
SET @loop = '''WHILE (select count(*) from dbo.tblDeps where Process_name = 
''''@process_name'''' and @deps = 1) = 0 BEGIN WAITFOR DELAY ''''00:00:02'''' break; END;''';

SET @loop = REPLACE(REPLACE(@loop, '@process_name', @process_name), '@deps', @deps);

print @loop;

exec (@loop);

END;

PRINT 语句可以很好地打印出来,我可以执行该字符串。

exec 命令失败并出现以下错误:

'WHILE (select count(*) from dbo.tblDeps where Process_name = 'proc' and dep_one= 1 AND dep_two = 1) = 0 BEGIN WAITF' 附近的语法不正确。

如您所见,字符串被截断,因此出现错误。

@loopvarchar(MAX) 所以一切都应该适合。

欢迎任何想法/建议。

谢谢!

【问题讨论】:

  • 您确定要将整个字符串放在引号中吗?将开头更改为 'WHILE ... 并将结尾更改为 ... END;' 应该会有所帮助。您看到的截断可能只是格式化错误消息的副作用。
  • 你在玩火,像这样在动态 SQL 中处理参数。研究sp_executesql 以及如何将参数传递给动态 SQL 字符串。此外,为您的过程提供多个值的table valued parameter,不要使用逗号分隔的字符串。

标签: tsql dynamic-sql truncation


【解决方案1】:

我能够准确地重现错误。从@loop 中删除多余的引号,你应该会很好。

SET @loop = 'WHILE (select count(*) from dbo.tblDeps where Process_name = 
''@process_name'' and @deps = 1) = 0 BEGIN WAITFOR DELAY ''00:00:02'' break; END;';

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-16
    相关资源
    最近更新 更多