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

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)

これは行かなければならないと思います(しゃれは意図されていません)私は、特別なケースが全体を爆破することを恐れて、それを試して解析する必要が本当にありたくなかったのです。

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

サム・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 に答える
0

GO「発言」だけはやめましょう。他の人が指摘したように、文字列が正しいステートメントシーケンスで構築されていることを確認する必要がある場合もあります。+=そもそも動的SQLのアイデアについてはよくわかりませんが、使用するのはおそらく最良のアイデアではありません。実際には、ここでカーソルを使用する方が適切な場合があります。

于 2012-08-19T18:32:47.793 に答える