Executando a concatenação de string a partir de linhas de dados em uma exibição TSQL (Pivot?)

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

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.

Foi útil?

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

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 :-)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top