级联多行成一个字符串
这是我在这里问在计算器的第一个问题,所以大家多多包涵请:)级联多行成一个字符串
我问它,因为它是有关这个问题的另一个线程,但被直接问在一个新的问题线程,所以在这里。
我有一张带有注释文本的表格,每行最多包含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
谢谢你的帮助,非常感谢。
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,因为它在逻辑流
感谢您的帮助,感激不尽。不过,我得到一个错误返回:“FOR XML无法序列化节点的数据‘文本()’,因为它包含未在XML允许的字符(0x0007)要使用FOR XML检索此数据,将其转换为。二进制,VARBINARY或图像数据类型和使用BINARY BASE64指令“。 - 我不知道如何解决这个错误 - 任何想法? – 2011-04-06 11:23:47
方面preceeds DISTINCT在SQL 2008,你可以使用VARCHAR(最大值)。它没有字符限制。 – tobias86 2011-04-06 08:45:25
你提到你已经通过notesrecid试图订购,但没有谈到这个列是什么。你可以添加表结构与列的一些解释? – 2011-04-06 08:57:53