Exec()的T-SQL换行符串连接

时间:2012-08-19 17:58:08

标签: sql tsql dynamic

所以,我遇到了一个非常恼人的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)

我想这个必须去(没有双关语)我真的不想尝试解析它,因为害怕特殊情况炸毁了整个事情。

3 个答案:

答案 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