Sql server 将多行合并为一个字符串
这是我在stackoverflow提出的第一个问题,请耐心听我说:) 我在另一个线程中问它,因为它与那个问题相关,但被引导在一个新的问题线程中问,所以它在这里 我有一个包含注释文本的表格,每行最多包含256个字符,这些文字按字段“linenumber”排序,但我不确定数据库中linenumber的顺序是否符合顺序。如何重新设计此查询,以确保每个notesrecid按行号排序 在表NOTES_V上有一个名为“linenumber”的字段,我尝试对以notesrecid和linenumber为别名的BA进行排序,但子查询中不允许排序 我意识到,在极端和极不可能的情况下,结果可能会溢出8000个字符的varchar,但这是一个问题,还是会“只是”被截断到8000个字符的最大值Sql server 将多行合并为一个字符串,sql-server,sql-server-2008,string-concatenation,Sql Server,Sql Server 2008,String Concatenation,这是我在stackoverflow提出的第一个问题,请耐心听我说:) 我在另一个线程中问它,因为它与那个问题相关,但被引导在一个新的问题线程中问,所以它在这里 我有一个包含注释文本的表格,每行最多包含256个字符,这些文字按字段“linenumber”排序,但我不确定数据库中linenumber的顺序是否符合顺序。如何重新设计此查询,以确保每个notesrecid按行号排序 在表NOTES_V上有一个名为“linenumber”的字段,我尝试对以notesrecid和linenumber为别名的
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)不可序列化,因此我稍微重写了一下查询,下面用一个空格替换CHAR(7)
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或SUBSTRING快
- 如果NOTES_V.TXT数据包含将成为XML实体的字符,则会得到一些意外的文本。对XML使用
,键入
,并从中提取值以确保不会发生这种情况
- 我更喜欢分组,因为它在逻辑流程上是不同的
- STUFF比LEFT或SUBSTRING快
- 如果NOTES_V.TXT数据包含将成为XML实体的字符,则会得到一些意外的文本。对XML使用
,键入
,并从中提取值以确保不会发生这种情况
- 我更喜欢分组,因为它在逻辑流程上是不同的