从SQL视图中的数据行执行字符串连接(pivot?)

时间:2010-01-25 17:29:51

标签: sql sql-server-2005 concatenation sql-view

我想在SQL Server中创建一个结合了多个数据库元数据的视图。

我想要的一段元数据存在于sys.syscomments表中 - 相关列如下:

id   colid  text
---- ------ -------------
1001 1       A comment.
1002 1       This is a lo
1002 2       ng comment.
1003 1       This is an e
1003 2       ven longer c
1003 3       omment!

正如您所看到的那样,如果“text”列中的数据超出了最大长度(SQL Server中为8000字节/ 4000个字符,我的示例中为12个字符),则会将其拆分为多行。 colid标识了将文本重新组合在一起的顺序。

我想在我的视图中创建查询/子查询来重新组装sys.syscomments表中的注释,以便我有:

id   comment (nvarchar(max))
---- ----------------------------------
1001 A comment.
1002 This is a long comment.
1003 This is an even longer comment!

有任何建议或解决方案吗?速度在任何方面都不重要,但简单性和低影响力(我想避免CLR函数等 - 理想情况下整个事情将被包含在视图定义中)。我已经研究了一些基于XML的建议,但结果产生了填充XML转义字符串的文本。

4 个答案:

答案 0 :(得分:13)

SELECT  id,
        (
        SELECT  text AS [text()]
        FROM    mytable mi
        WHERE   mi.id = md.id
        ORDER BY
                mi.col
        FOR XML PATH(''), TYPE
        ).value('/', 'NVARCHAR(MAX)')
FROM    (
        SELECT  DISTINCT id
        FROM    mytable
        ) md

答案 1 :(得分:1)

有几种可能的解决方案。最简单的是使用CTE。本文对该主题进行了很好的讨论:Concatenating Row Values in Transact-SQL

答案 2 :(得分:1)

答案 3 :(得分:1)

为什么不使用sys.sql_modules定义列将数据存储为单个nvarchar(max)?

而不是读取几个syscomments文本(nvarchar(4000))列遍布多行并且必须连接。

SELECT object_id, definition FROM sys.sql_modules

只是一个想法......你说的很简单: - )