Выполнение конкатенации строк из строк данных в представлении TSQL (pivot?)

StackOverflow https://stackoverflow.com/questions/2134199

Вопрос

Я хотел бы создать представление в 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, но в результате получился текст, заполненный управляющими строками XML.

Это было полезно?

Решение

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

Другие советы

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

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

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

SELECT object_id, definition FROM sys.sql_modules

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top