Executando a concatenação de string a partir de linhas de dados em uma exibição TSQL (Pivot?)
-
22-09-2019 - |
Pergunta
Eu gostaria de criar uma visualização no SQL Server que combina várias peças de metadados do banco de dados.
Um pedaço de metadados que eu quero vidas no sys.syscomments
Tabela - As colunas relevantes são as seguintes:
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!
Como você pode ver, os dados na coluna "texto" são divididos em várias linhas se passar o comprimento máximo (8000 bytes/4000 caracteres no SQL Server, 12 caracteres no meu exemplo). colid
Identifica a ordem para montar o texto novamente.
Gostaria de fazer consulta/subconsulta na minha opinião para remontar os comentários da tabela Sys.Siscomments, para que eu tenha:
id comment (nvarchar(max))
---- ----------------------------------
1001 A comment.
1002 This is a long comment.
1003 This is an even longer comment!
Alguma sugestão ou soluções? A velocidade não é de forma alguma crítica, mas a simplicidade e o baixo impacto são (eu gostaria de evitar funções de CLR e similares - idealmente, tudo seria envolvido na definição de exibição). Eu analisei algumas sugestões baseadas em XML, mas os resultados produziram texto preenchido com strings de escape XML.
Solução
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
Outras dicas
Existem várias soluções possíveis. O mais simples é usar o CTE. Este artigo tem uma boa discussão sobre o tópico: Valores de linha concatenadora no Transact-SQL
Dê uma olhada aqui: Concatenar valores de várias linhas em uma coluna ordenada
Por que não usar sys.sql_modules Colunas de definição que armazenam os dados como um único nvarchar (max)?
Em vez de ler várias colunas de texto (nvarchar (4000)), espalhadas por várias linhas e tendo que concatenar.
SELECT object_id, definition FROM sys.sql_modules
Apenas um pensamento ... você disse simples :-)