所以,我遇到了一个非常恼人的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
我不想用Cursor来代码代码,有什么方法吗?谢谢!
编辑: 好的,所以看起来问题实际上只与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)
我想这个必须去(没有双关语)我真的不想尝试解析它,因为害怕特殊情况炸毁了整个事情。
答案 0 :(得分:0)
没有select
的{{1}}语句可以按任意顺序自由返回结果。
您必须指定SQL代码段的有效顺序:
order by
正如@Bort在评论中建议的那样,如果片段是独立的SQL,则可以用分号分隔它们。 T-SQL中的回车,换行符,制表符和空格都是相同的:它们是空格。
select @sql += char(13) + char(10) + [sql]
from [SqlTable]
order by
SnippetSequenceNr
答案 1 :(得分:0)
摆脱GO
“陈述”。正如其他人所指出的,您可能还需要确保字符串是在正确的语句序列中构造的。使用+=
可能不是最好的主意,尽管我首先不确定动态sql的想法。在这里使用游标可能更合适。
答案 2 :(得分:0)
Sam F,
您的方法不适用于字符串连接的FOR XML方法(如果您想根据在表的不同行中找到的值创建“行”分隔列表)。但是,用SPACE(13)替换char(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