6

我想在 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!

如您所见,如果“文本”列中的数据超过最大长度(在 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

4 回答 4

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
于 2010-01-25T17:43:47.400 回答
1

有几种可能的解决方案。最简单的一种是使用 CTE。本文对以下主题进行了很好的讨论:在 Transact-SQL 中连接行值

于 2010-01-25T17:34:40.997 回答
1

看看这里:将多行中的值连接到一列有序

于 2010-01-25T17:36:01.993 回答
1

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

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

SELECT object_id, definition FROM sys.sql_modules

只是一个想法......你确实说简单:-)

于 2010-01-25T19:52:02.040 回答