Como faço para exibir o conteúdo completo de uma coluna de texto ou varchar (MAX) no SQL Server 2008 Management Studio?


94

Neste banco de dados SQL Server 2008 (build 10.0.1600) ativo, há uma Eventstabela que contém uma textcoluna chamada Details. (Sim, eu sei que isso deveria ser uma varchar(MAX)coluna, mas quem configurou este banco de dados não fez dessa forma.)

Esta coluna contém registros muito grandes de exceções e dados JSON associados que estou tentando acessar por meio do SQL Server Management Studio, mas sempre que copio os resultados da grade para um editor de texto, ele os trunca em 43679 caracteres.

Eu li em vários locais na Internet que você pode definir o máximo de caracteres recuperados para dados XML Tools > Options > Query Results > SQL Server > Results To Gridcomo Ilimitado e, em seguida, executar uma consulta como esta:

select Convert(xml, Details) from Events
where EventID = 13920

(Observe que os dados em coluna não são XML de forma alguma. CONVERTTransformar a coluna em XML é apenas uma solução alternativa que descobri no Google que alguém usou para contornar o limite que o SSMS tem de recuperar dados de uma coluna textou varchar(MAX).)

No entanto, após definir a opção acima, executar a consulta e clicar no link do resultado, ainda recebo o seguinte erro:

Incapaz de mostrar XML. Ocorreu o seguinte erro: Ocorreu um fim de arquivo inesperado. Linha 5, posição 220160.

Uma solução é aumentar o número de caracteres recuperados do servidor para dados XML. Para alterar essa configuração, no menu Ferramentas, clique em Opções.

Então, alguma ideia de como acessar esses dados? Converter a coluna varchar(MAX)resolveria minhas aflições?

Respostas:


96

O SSMS permite apenas dados ilimitados para dados XML. Este não é o padrão e precisa ser definido nas opções.

insira a descrição da imagem aqui

Um truque que pode funcionar em circunstâncias bastante limitadas é simplesmente nomear a coluna de uma maneira especial como a seguir, para que ela seja tratada como dados XML.

DECLARE @S varchar(max) = 'A'

SET @S =  REPLICATE(@S,100000) + 'B' 

SELECT @S as [XML_F52E2B61-18A1-11d1-B105-00805F49916B]

No SSMS (pelo menos das versões de 2012 à atual de 18.3), isso exibe os resultados conforme abaixo

insira a descrição da imagem aqui

Clicar nele abre os resultados completos no visualizador de XML. Rolar para a direita mostra que o último caractere de B é preservado,

No entanto, isso tem alguns problemas significativos. Adicionar colunas extras à consulta quebra o efeito e todas as linhas extras se tornam concatenadas com a primeira. Finalmente, se a string contém caracteres como< abrir o visualizador XML, falhará com um erro de análise.

Uma maneira mais robusta de fazer isso que evita problemas de conversão do SQL Server <para &lt;etc ou falha devido a esses caracteres está abaixo ( crédito de Adam Machanic aqui ).

DECLARE @S varchar(max)

SELECT @S = ''

SELECT @S = @S + '
' + OBJECT_DEFINITION(OBJECT_ID) FROM SYS.PROCEDURES

SELECT @S AS [processing-instruction(x)] FOR XML PATH('')

2
Adicionar CDATA à instrução Convert funcionou! Muito obrigado. :)
adamjford

Adicionar CDATApode funcionar, mas se seus dados incluem caracteres de controle, você deve realizar uma operação de substituição. No meu caso, estava usando o Separador de Unidade, Código ASCII 31, em meus dados. Como eu estava usando apenas aquele personagem em muitos lugares, um simples REPLACE(details, char(31), '&x1f;')bastou. Se eu tivesse caracteres desconhecidos ou um grande número de caracteres diferentes para substituir, talvez tivesse que encontrar outra solução.
Zarefete

@Zarepheth - A CDATAcoisa foi minha primeira sugestão. O último AS [processing-instruction(x)]evita isso.
Martin Smith

1
@MartinSmith excelente resposta! Me pergunto o quanto eu aprendo com suas respostas! +1
Kin Shah

50

Consegui fazer isso funcionar ...

SELECT CAST('<![CDATA[' + LargeTextColumn + ']]>' AS XML) FROM TableName;

24

Uma alternativa é clicar com o botão direito do mouse no conjunto de resultados e selecionar "Salvar resultados como ...". Isso o exporta para um arquivo CSV com todo o conteúdo da coluna. Não é perfeito, mas funcionou bem o suficiente para mim.

Gambiarra


9

Você tentou esta solução simples? Apenas 2 cliques de distância!

Na janela de consulta,

  1. defina as opções de consulta para "Resultados para grade", execute sua consulta
  2. Clique com o botão direito na guia de resultados no canto da grade, salve os resultados como qualquer arquivo

Você obterá todo o texto que deseja ver no arquivo !!! Posso ver 130.556 caracteres para o meu resultado de um campo varchar (MAX)

Resultados em um arquivo


1
Direto - fácil - e sempre esquecido até que você precise novamente :)
Dimi Takis

5

A solução mais simples que encontrei é fazer o backup da tabela e visualizar o script. Para fazer isso

  1. Clique com o botão direito em seu banco de dados e escolha Tasks >Generate Scripts...
  2. Clique na página "Introdução" Next
  3. Página "Escolher Objetos"
    1. Escolha o Select specific database objects e selecione sua mesa.
    2. Clique Next
  4. Página "Definir opções de script"
    1. Defina o tipo de saída para Save scripts to a specific location
    2. Selecione Save to filee preencha as opções relacionadas
    3. Clique no Advancedbotão
    4. Defina General> Types of data to scriptpara Data onlyou Schema and Datae clique em ok
    5. Clique Next
  5. "Página de Resumo" clique em próximo
  6. Seu script sql deve ser gerado com base nas opções definidas em 4.2. Abra este arquivo e visualize seus dados.

3

O tipo de dados TEXT é antigo e não deve ser mais usado, é difícil selecionar dados em uma coluna TEXT.

ntext, text e image (Transact-SQL)

Os tipos de dados ntext, text e image serão removidos em uma versão futura do Microsoft SQL Server. Evite usar esses tipos de dados em novos trabalhos de desenvolvimento e planeje modificar os aplicativos que os usam atualmente. Use nvarchar (max), varchar (max) e varbinary (max).

você precisa usar TEXTPTR (Transact-SQL) para recuperar os dados de texto.

Consulte também este artigo sobre como lidar com o tipo de dados de texto .


A conversão da coluna varchar(MAX)impedirá o SSMS de truncar os dados dela?
adamjford

Eu usaria primeiro o SSMS para gerar o script para converter sua coluna TEXT em varchar (max). A partir daí, você pode avaliar se deseja convertê-lo posteriormente em uma coluna XML. Quanto aos limites de exibição do SSMS, os resultados da grade podem ser configurados para exibir até 65.535 caracteres de dados não xml por coluna, e até uma quantidade ilimitada de dados xml (fyi, colunas de tabela do tipo XML podem armazenar apenas 2 GB). Enquanto os resultados para texto são limitados a 8.192 caracteres por coluna. Para definir esses limites máximos padrão, vá para (no SSMS) menu FERRAMENTAS, OPÇÕES ..., QUERY RESULTS, SQL SERVER e RESULTS TO GRID ou RESULTS TO TEXT.
KM.

3

Parece que o Xml pode não estar bem formado. Se for esse o caso, você não poderá convertê-lo como Xml e, por isso, você está limitado em quanto texto pode retornar no Management Studio. No entanto, você pode quebrar o texto em pedaços menores, como:

With Tally As
    (
        Select ROW_NUMBER() OVER ( ORDER BY s1.object_id ) - 1 As Num
        From sys.sysobjects As s1
            Cross Join sys.sysobjects As s2
    )
Select Substring(T1.textCol, T2.Num * 8000 + 1, 8000)
From Table As T1
    Cross Join Tally As T2
Where T2.Num <= Ceiling(Len(T1.textCol) / 8000)
Order By T2.Num

Em seguida, você precisará combiná-los manualmente novamente.

EDITAR

Parece que há alguns caracteres nos textdados dos quais o analisador Xml não gosta. Você pode tentar converter esses valores em entidades e, em seguida, tentar o Convert(xml, data)truque. Então, algo como:

Update Table
Set Data = Replace(Cast(Data As varchar(max)),'<','&lt;')

(Eu precisei converter em varchar (max) porque a função de substituição não funcionará em textcolunas. Não deve haver nenhum motivo para você não poder converter essas textcolunas varchar(max).)


Oh, suponho que devo mencionar que a coluna não é XML de forma alguma. CONVERTER a coluna para XML é apenas uma solução alternativa que descobri no Google que outra pessoa usou para contornar o limite que o SSMS tem de recuperar dados de uma coluna textou varchar(MAX).
adamjford

1
EDITAR do seu código acima; Com Tally As (Selecione ROW_NUMBER () OVER (ORDER BY s1.id) - 1 As Num From sys.sysobjects As s1 Cross Join sys.sysobjects As s2) Selecione Substring (T1.YourTextCol, T2.Num * 8000 + 1, 8000) De YourTable As T1 Cross Join Tally As T2 Onde T2.Num <= Ceiling (datalength (T1.YourTextCol) / 8000) Ordem por T2.Num
Ian Quigley

Usar o TSQLde @IanQuigley com base nesta resposta funcionou bem para mim. Basicamente, peguei os resultados (acabei sendo 11 registros) e apenas colei-os no Bloco de Notas. Funcionou perfeitamente. Precisa salvar este script. Eu tinha um XML muito longo que incluía caracteres inválidos.
atconway

1

Eu prefiro este simples hack XML que torna as colunas clicáveis ​​no SSMS em uma base célula por célula. Com este método, você pode visualizar seus dados rapidamente na visualização tabular do SSMS e clicar em células específicas para ver o valor total quando forem interessantes. Isso é idêntico à técnica do OP, exceto que evita os erros de XML.

SELECT
     e.EventID
    ,CAST(REPLACE(REPLACE(e.Details, '&', '&amp;'), '<', '&lt;') AS XML) Details
FROM Events e
WHERE 1=1
AND e.EventID BETWEEN 13920 AND 13930
;

Observe que alguns caracteres são inválidos em XML 1.0, mas válidos em NVARCHAR/ VARCHAR. Por exemplo, o caractere NUL (diferente de NULLcomo um valor para o campo). O elenco falhará para strings com tais valores incorporados.
binki

1

A partir do SSMS 18.2, agora você pode visualizar até 2 milhões de caracteres nos resultados da grade. Fonte

Permite que mais dados sejam exibidos (Resultado para Texto) e armazenados em células (Resultado para Grade). O SSMS agora permite até 2 milhões de caracteres para ambos.

Eu verifiquei isso com o código abaixo.

DECLARE @S varchar(max) = 'A'

SET @S =  REPLICATE(@S,2000000) + 'B' 

SELECT @S as a

1
O máximo de caracteres é, na verdade, 2097152 ( no SSMS versão 15.0.18333.0 ).
estomia

0

Você está sem sorte, eu acho. O problema não é um problema de nível de SQL, como todas as outras respostas parecem se concentrar, mas simplesmente um problema da interface do usuário. O Management Studio não se destina a ser uma interface de acesso de dados genérica / de propósito geral. Não existe para ser sua interface, mas sua área administrativa, e tem sérias limitações ao lidar com dados binários e grandes dados de teste - porque as pessoas que os usam dentro do perfil de uso especificado não terão esse problema.

Apresentar dados de texto grandes simplesmente não é o uso planejado.

Sua única opção seria uma função com valor de tabela que pega a entrada de texto e corta as linhas para cada linha, de modo que o Management Studio obtenha uma lista de linhas, não uma única linha.


Acho que essa resposta é, na melhor das hipóteses, uma conjectura, ou você tem alguma fonte para o "uso planejado"? Se for um "estúdio de gerenciamento" de SQL, ele deve pelo menos ser capaz de me mostrar o conteúdo de meus bancos de dados. UI absolutamente horrível.
dia

Esta resposta deve ser excluída porque não é mais aplicável
Caius Jard
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.