Выполнение конкатенации строк из строк данных в представлении TSQL (сводка?) - PullRequest
6 голосов
/ 25 января 2010

Я хотел бы создать представление в 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!

Как видно, данные в столбце «текст» разбиваются на несколько строк, если они проходят максимальную длину (8000 байт / 4000 символов в SQL Server, 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, но в результате был получен текст, заполненный escape-строками XML.

Ответы [ 4 ]

13 голосов
/ 25 января 2010
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 голос
/ 25 января 2010

Почему бы не использовать sys.sql_modules определения столбцов, которые хранят данные в виде одного nvarchar (max)?

Вместо чтения нескольких текстовых столбцов syscomments (nvarchar (4000)), разбросанных по нескольким строкам и требующих объединения.

SELECT object_id, definition FROM sys.sql_modules

Просто мысль ... ты сказал просто: -)

1 голос
/ 25 января 2010
1 голос
/ 25 января 2010

Есть несколько возможных решений. Самый простой - использовать CTE. В этой статье подробно обсуждается тема: Объединение значений строк в Transact-SQL

...