【发布时间】: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' 附近的语法不正确。
如您所见,字符串被截断,因此出现错误。
@loop 是 varchar(MAX) 所以一切都应该适合。
欢迎任何想法/建议。
谢谢!
【问题讨论】:
-
您确定要将整个字符串放在引号中吗?将开头更改为
'WHILE ...并将结尾更改为... END;'应该会有所帮助。您看到的截断可能只是格式化错误消息的副作用。 -
你在玩火,像这样在动态 SQL 中处理参数。研究sp_executesql 以及如何将参数传递给动态 SQL 字符串。此外,为您的过程提供多个值的table valued parameter,不要使用逗号分隔的字符串。
标签: tsql dynamic-sql truncation