Выполнение конкатенации строк из строк данных в представлении TSQL (pivot?)
-
22-09-2019 - |
Вопрос
Я хотел бы создать представление в 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
Просто мысль...ты же сказал просто :-)