2011-04-06 93 views
1

這是我在這裏問在計算器的第一個問題,所以大家多多包涵請:)級聯多行成一個字符串

我問它,因爲它是有關這個問題的另一個線程,但被直接問在一個新的問題線程,所以在這裏。

我有一張帶有註釋文本的表格,每行最多包含256個字符,這些表格按字段「linenumber」排序,但我不確定數據庫中的linenumber順序是否正確。我將如何重新設計這個查詢的行號爲每個notesrecid確保測序?

在表NOTES_V上有一個名爲「linenumber」的字段 - 我嘗試訂購由notesrecid和linenumber構成的BA,但在子查詢中不允許排序。

我意識到,在極端不大可能案件的結果可能會溢出VARCHAR的8000個字符,但是這有什麼問題或將它「只是」被截斷爲8000字符最多?

SELECT A.DATASET, A.NOTESRECID, LEFT(A.NOTETXT,LEN(A.NOTETXT)-2) AS "NOTETXT", LEN(A.NOTETXT)-2 AS "#CHARS" 
FROM (SELECT DISTINCT BB.DATASET, BB.NOTESRECID, 
     (SELECT BA.TXT+', ' AS [text()] 
     FROM NOTES_V BA 
     WHERE BA.DATASET=BB.DATASET AND BA.NOTESRECID=BB.NOTESRECID 
     ORDER BY BA.DATASET, BA.NOTESRECID 
     FOR XML PATH ('')) [NOTETXT] 
    FROM NOTES_V BB) A 

下面所寫的方法效果很好,但我遇到了與CHAR(7)不被序列化的問題,所以我稍微重新編寫查詢是低於(7)用空格代替CHAR。

SELECT A.DATASET, A.NOTESRECID, A.NOTETXT, LEN(A.NOTETXT) AS "#CHARS" 
FROM (SELECT BB.DATASET, BB.NOTESRECID, 
     stuff((SELECT REPLACE(BA.TXT,CHAR(7),' ')+', ' AS [text()] 
      FROM NOTES_V BA 
      WHERE BA.DATASET=BB.DATASET AND BA.NOTESRECID=BB.NOTESRECID 
      ORDER BY BA.DATASET, BA.NOTESRECID, BA.linenumber 
      FOR XML PATH ('A'),type).value('.','nvarchar(max)'),1,2,'') [NOTETXT] 
      FROM NOTES_V BB 
      GROUP BY BB.DATASET, BB.NOTESRECID) A 

謝謝你的幫助,非常感謝。

+0

方面preceeds DISTINCT在SQL 2008,你可以使用VARCHAR(最大值)。它沒有字符限制。 – tobias86 2011-04-06 08:45:25

+0

你提到你已經通過notesrecid試圖訂購,但沒有談到這個列是什麼。你可以添加表結構與列的一些解釋? – 2011-04-06 08:57:53

回答

1
SELECT A.DATASET, A.NOTESRECID, A.NOTETXT, LEN(A.NOTETXT) AS "#CHARS" 
FROM (SELECT BB.DATASET, BB.NOTESRECID, 
     stuff((SELECT BA.TXT+', ' AS [text()] 
     FROM NOTES_V BA 
     WHERE BA.DATASET=BB.DATASET AND BA.NOTESRECID=BB.NOTESRECID 
     ORDER BY BA.DATASET, BA.NOTESRECID, BA.linenumber 
     FOR XML PATH ('A'),type).value('.','nvarchar(max)'),1,2,'') [NOTETXT] 
    FROM NOTES_V BB 
    GROUP BY BB.DATASET, BB.NOTESRECID) A 

注:

  • STUFF比LEFT快或子
  • 如果您NOTES_V.TXT數據所包含的字符,這將成爲XML實體,你會得到一些意想不到的文本。使用FOR XML, TYPE和獲取價值從它確保這種情況不會發生
  • 我喜歡GROUP BY,因爲它在邏輯流
+0

感謝您的幫助,感激不盡。不過,我得到一個錯誤返回:「FOR XML無法序列化節點的數據‘文本()’,因爲它包含未在XML允許的字符(0x0007)要使用FOR XML檢索此數據,將其轉換爲。二進制,VARBINARY或圖像數據類型和使用BINARY BASE64指令「。 - 我不知道如何解決這個錯誤 - 任何想法? – 2011-04-06 11:23:47