Sql-Server
CTE 查詢到 CONCAT 文本(超過 10,000 行)
我正在嘗試建構一個 CTE 查詢來循環遍歷數據行並將文本連接到每個SampleUserNumber的一行中。
以下是我正在使用的內容:
CREATE TABLE #SampleTable ( SampleRowID INT IDENTITY(1,1), SampleUserNumber INT, SampleLineNumber INT, SampleTextLine VARCHAR(1000) )
這是我的 CTE 查詢:
這是輸出:
CTE 查詢有效,結果正確,但我的主要問題是性能和我必須處理的記錄數量。現在我至少要處理 100,000 條記錄。
問題:
- 我是否錯誤地編寫了查詢以處理 100,000 條記錄?有沒有更有效的方法來編寫 CTE?
- 有沒有另一種更有效和更好的方法來做到這一點?
$$ looping would be out of the question unless I have no other choice $$
對不起所有的圖片。我認為展示所有內容比在這裡寫出來要容易得多。
謝謝你。
相比之下,這種方法如何?
SELECT SampleUserNumber, CombinedMessage = STUFF( (SELECT N' ' + SampleTextLine FROM #SampleTable WHERE SampleUserNumber = t.SampleUserNumber ORDER BY SampleLineNumber FOR XML PATH, TYPE).value(N'.[1]',N'nvarchar(max)'),1,1,'') FROM #SampleTable AS t GROUP BY SampleUserNumber ORDER BY SampleUserNumber;
對於您的 #temp 表來說,在s 的
SampleUserNumber, SampleLineNumber
那兩列上有一個聚集索引或至少有一個非聚集索引可能會很有用。INCLUDE``SampleTextLine
在 SQL Server 2017 中,您將能夠使用更直接的方法,幾乎可以保證更快:
SELECT SampleUserNumber, CombinedMessage = STRING_AGG(CONVERT(varchar(max),SampleTextLine), ' ') WITHIN GROUP (ORDER BY SampleLineNumber) FROM #SampleTable GROUP BY SampleUserNumber ORDER BY SampleUserNumber;
為避免這種情況,
CONVERT
您可以將 #temp 表列設為一種MAX
類型。