0

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

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

4

3 回答 3

0

没有的select语句order by可以自由地以任何顺序返回结果。

您必须指定 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
于 2012-08-19T18:03:20.903 回答
0

只需摆脱GO“声明”。正如其他人所指出的,您可能还需要确保以正确的语句顺序构造字符串。使用+=可能不是最好的主意,尽管我首先不确定动态 sql 的想法。在这里使用游标实际上可能更合适。

于 2012-08-19T18:32:47.793 回答
0

山姆·F,

您的方法不适用于字符串连接的 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 
于 2013-05-17T20:24:31.360 回答