级联多行成一个字符串

问题描述:

这是我在这里问在计算器的第一个问题,所以大家多多包涵请:)级联多行成一个字符串

我问它,因为它是有关这个问题的另一个线程,但被直接问在一个新的问题线程,所以在这里。

我有一张带有注释文本的表格,每行最多包含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

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