Sql server 将多行合并为一个字符串

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为别名的

这是我在stackoverflow提出的第一个问题,请耐心听我说:)

我在另一个线程中问它,因为它与那个问题相关,但被引导在一个新的问题线程中问,所以它在这里

我有一个包含注释文本的表格,每行最多包含256个字符,这些文字按字段“linenumber”排序,但我不确定数据库中linenumber的顺序是否符合顺序。如何重新设计此查询,以确保每个notesrecid按行号排序

在表NOTES_V上有一个名为“linenumber”的字段,我尝试对以notesrecid和linenumber为别名的BA进行排序,但子查询中不允许排序

我意识到,在极端和极不可能的情况下,结果可能会溢出8000个字符的varchar,但这是一个问题,还是会“只是”被截断到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)不可序列化,因此我稍微重写了一下查询,下面用一个空格替换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使用
    ,键入
    ,并从中提取值以确保不会发生这种情况
  • 我更喜欢分组,因为它在逻辑流程上是不同的

在SQL 2008中,可以使用varchar(max)。它没有字符限制。您提到您已尝试按notesrecid排序,但没有说明此列是什么。请添加表结构并对列进行一些解释,好吗?在SQL 2008中,可以使用varchar(max)。它没有字符限制。您提到您已尝试按notesrecid排序,但没有说明此列是什么。请您添加一些列的解释表结构好吗?谢谢您的帮助,谢谢。但是,返回了一个错误:“FOR XML无法序列化节点“text()”的数据,因为它包含XML中不允许的字符(0x0007)。若要使用FOR XML检索此数据,请将其转换为binary、varbinary或image数据类型,并使用binary BASE64指令。”-我不知道如何处理这个错误-有什么想法吗?谢谢你的帮助,谢谢。但是,返回了一个错误:“FOR XML无法序列化节点“text()”的数据,因为它包含XML中不允许的字符(0x0007)。若要使用FOR XML检索此数据,请将其转换为binary、varbinary或image数据类型,并使用binary BASE64指令。”-我不知道如何处理这个错误-有什么想法吗?