Sql-Server

CTE 查詢到 CONCAT 文本(超過 10,000 行)

  • April 17, 2019

我正在嘗試建構一個 CTE 查詢來循環遍歷數據行並將文本連接到每個SampleUserNumber的一行中。

以下是我正在使用的內容:

CREATE TABLE #SampleTable
(
SampleRowID INT IDENTITY(1,1),
SampleUserNumber INT,
SampleLineNumber INT,
SampleTextLine VARCHAR(1000)
)

樣本數據

這是我的 CTE 查詢:

CTE 查詢

這是輸出:

結果

CTE 查詢有效,結果正確,但我的主要問題是性能和我必須處理的記錄數量。現在我至少要處理 100,000 條記錄。

問題:

  1. 我是否錯誤地編寫了查詢以處理 100,000 條記錄?有沒有更有效的方法來編寫 CTE?
  2. 有沒有另一種更有效和更好的方法來做到這一點?

$$ 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類型。

引用自:https://dba.stackexchange.com/questions/235061