[英]T-SQL Newline String Concatenation For Exec()
因此,我遇到了T-SQL的一个非常烦人的问题...本质上,在一个表中,有几个T-SQL语句。 我希望存储过程可以有效地捕获这些行并将它们连接为变量。 然后,使用EXEC(@TSQL)执行连接的行
问题是,调用Exec时,似乎会删除带有换行符的字符串连接。
例如类似:
declare @sql nvarchar(max) = ''
select @sql += char(13) + char(10) + [sql] from [SqlTable]
exec(@sql) -- Won't always do the right thing
print @sql -- Looks good
我不想用游标来宰杀代码,这有什么办法吗? 谢谢!
编辑:好的,因此看起来该问题实际上仅与GO语句有关,例如:
declare @test nvarchar(max) = 'create table #test4(i int) ' + char(10) + char(13) + 'GO' + char(10) + char(13) +'create table #test5(i int)'
exec(@test)
我想这将是必须要做的(没有双关语),我只是真的不想不想尝试解析它,以免担心特殊情况会炸毁整个东西。
没有order by
select
语句可以按任意顺序返回结果。
您必须指定您的SQL代码段有意义的顺序:
select @sql += char(13) + char(10) + [sql]
from [SqlTable]
order by
SnippetSequenceNr
正如@Bort在注释中建议的那样,如果代码段是独立的SQL,则可以使用分号将它们分开。 回车,换行符,制表符和空格在T-SQL中都是相同的:它们是空格。
select @sql += [sql] + ';'
from [SqlTable]
order by
SnippetSequenceNr
只是摆脱GO
“声明”。 正如其他人所指出的那样,您可能还需要确保字符串以正确的语句顺序构造。 尽管我不确定动态sql的想法,但是使用+=
可能不是最好的想法。 实际上,在此处使用游标可能更合适。
山姆
您的方法不适用于字符串连接的FOR XML方法(如果要基于在表的不同行中找到的值创建“行”定界列表)。 但是,将char(13)替换为SPACE(13),则效果很好。
SELECT PackageNote = SUBSTRING((SELECT (SPACE(13) + char(10) + PackageDescription)
FROM POPackageNote PN2
WHERE PN1.PurchaseOrderNumber = PN2.PurchaseOrderNumber
ORDER BY POPackageNoteID, PackageDescription
FOR XML PATH( '' )
), 3, 1000 )
FROM POPackageNote PN1
WHERE (PurchaseOrderNumber = @PurchaseOrderNumber)
GROUP BY PurchaseOrderNumber
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.