単一のクエリを使用して、SQL でおそらく数千行のテキストを連結しようとしています。現在のクエリは次のようになります。
DECLARE @concatText NVARCHAR(MAX)
SET @concatText = ''
UPDATE TOP (SELECT MAX(PageNumber) + 1 FROM #OrderedPages) [#OrderedPages]
SET @concatText = @concatText + [ColumnText] + '
'
WHERE (RTRIM(LTRIM([ColumnText])) != '')
これは、機能的な観点からは完全に正常に機能しています。唯一の問題は、ColumnText の長さが数キロバイトになる場合があることです。その結果、これらの行が数千になると、tempDB がいっぱいになります。
私たちが思いついた一番の理由は、@concatText に対してこれらの更新を行っているときに、SQL が暗黙のトランザクションを使用しているため、文字列が事実上不変になっているということです。
この問題を解決する良い方法を見つけようとしていますが、これまでのところ 2 つの解決策があります。1) .NET で連結を行います。これは問題のないオプションですが、大量のデータがネットワークを介して戻ってくる可能性があります。
2) .NET の String.Join メソッドと同様の方法で動作する .WRITE を使用します。BoL はこのレベルの SQL シェナニガンをカバーしていないため、これの構文を理解できません。
これは私に疑問を投げかけます: .WRITE は動作しますか? もしそうなら、構文は何ですか?そうでない場合、データを .NET に送信せずにこれを行う他の方法はありますか? FOR XML
テキストに不正な XML 文字が含まれている可能性があるため、使用できません。
前もって感謝します。