簡體   English   中英

適用於Exec()的T-SQL換行符字符串連接

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM