¿Cómo veo el contenido completo de una columna de texto o varchar (MAX) en SQL Server 2008 Management Studio?

94

En esta base de datos en vivo de SQL Server 2008 (compilación 10.0.1600), hay una Eventstabla, que contiene una textcolumna llamada Details. (Sí, me doy cuenta de que esto debería ser una varchar(MAX)columna, pero quien configuró esta base de datos no lo hizo de esa manera).

Esta columna contiene registros muy grandes de excepciones y datos JSON asociados a los que intento acceder a través de SQL Server Management Studio, pero cada vez que copio los resultados de la cuadrícula a un editor de texto, los trunca en 43679 caracteres.

He leído en varios lugares de Internet que puede establecer el número máximo de caracteres recuperados para datos XML en Tools > Options > Query Results > SQL Server > Results To Gridilimitado y luego realizar una consulta como esta:

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

(Tenga en cuenta que los datos de la columna no son XML en absoluto. La CONVERTconversión de la columna a XML es simplemente una solución alternativa que encontré al buscar en Google que alguien más ha usado para sortear el límite que SSMS tiene para recuperar datos de una columna texto varchar(MAX)).

Sin embargo, después de configurar la opción anterior, ejecutar la consulta y hacer clic en el enlace en el resultado, todavía obtengo el siguiente error:

No se puede mostrar XML. Se produjo el siguiente error: Se produjo un final inesperado del archivo. Línea 5, posición 220160.

Una solución es aumentar el número de caracteres recuperados del servidor para datos XML. Para cambiar esta configuración, en el menú Herramientas, haga clic en Opciones.

Entonces, ¿ alguna idea sobre cómo acceder a estos datos? ¿Convertiría la columna para varchar(MAX)solucionar mis problemas?

Adamjford
fuente

Respuestas:

97

SSMS solo permite datos ilimitados para datos XML. Este no es el predeterminado y debe configurarse en las opciones.

ingrese la descripción de la imagen aquí

Un truco que podría funcionar en circunstancias bastante limitadas es simplemente nombrar la columna de una manera especial como se muestra a continuación para que se trate como datos XML.

DECLARE @S varchar(max) = 'A'

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

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

En SSMS (al menos las versiones de 2012 a la actual de 18.3) esto muestra los resultados como se muestra a continuación

ingrese la descripción de la imagen aquí

Al hacer clic en él, se abren los resultados completos en el visor XML. Desplazarse hacia la derecha muestra que se conserva el último carácter de B,

Sin embargo, esto tiene algunos problemas importantes. Agregar columnas adicionales a la consulta rompe el efecto y las filas adicionales se concatenan con la primera. Finalmente, si la cadena contiene caracteres como <abrir, el visor XML falla con un error de análisis.

Una forma más robusta de hacer esto que evita problemas de conversión de SQL Server <a &lt;etc. o falla debido a estos caracteres se encuentra a continuación ( crédito Adam Machanic aquí ).

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('')
Martin Smith
fuente
2
¡Agregar CDATA a la declaración Convert funcionó! Muchas gracias. :)
Adamjford
Agregar CDATApuede funcionar, pero si sus datos incluyen caracteres de control, debe realizar una operación de reemplazo. En mi caso, estaba usando el Separador de unidades, código ASCII 31, dentro de mis datos. Como solo estaba usando ese carácter en muchos lugares, REPLACE(details, char(31), '&x1f;')bastaba con un simple . Si tuviera caracteres desconocidos o una gran cantidad de caracteres diferentes para reemplazar, es posible que haya tenido que encontrar otra solución.
Zarepheth
@Zarepheth - La CDATAcosa fue mi primera sugerencia. El último AS [processing-instruction(x)]evita eso.
Martin Smith
1
@MartinSmith ¡excelente respuesta! ¡Me pregunto cuánto aprendo de tus respuestas! +1
Kin Shah
50

Pude hacer que esto funcionara ...

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

Una solución alternativa es hacer clic con el botón derecho en el conjunto de resultados y seleccionar "Guardar resultados como ...". Esto lo exporta a un archivo CSV con todo el contenido de la columna. No es perfecto, pero funcionó lo suficientemente bien para mí.

Solución alterna

Darky711
fuente
10

¿Probaste esta sencilla solución? ¡A solo 2 clics de distancia!

En la ventana de consulta,

  1. establece las opciones de consulta en "Resultados en cuadrícula", ejecuta tu consulta
  2. Haga clic derecho en la pestaña de resultados en la esquina de la cuadrícula, guarde los resultados como cualquier archivo

Obtendrás todo el texto que quieras ver en el archivo !!! Puedo ver 130,556 caracteres para mi resultado de un campo varchar (MAX)

Resultados en un archivo

Hoja de Jenna
fuente
1
Directo - fácil - y siempre olvidado hasta que lo necesites de nuevo :)
Dimi Takis
5

La solución alternativa más sencilla que encontré es hacer una copia de seguridad de la tabla y ver el script. Para hacer esto

  1. Haga clic derecho en su base de datos y elija Tasks>Generate Scripts...
  2. Haga clic en la página "Introducción" Next
  3. Página "Elegir objetos"
    1. Elija Select specific database objectsy seleccione su mesa.
    2. Hacer clic Next
  4. Página "Establecer opciones de secuencias de comandos"
    1. Establezca el tipo de salida en Save scripts to a specific location
    2. Seleccione Save to filey complete las opciones relacionadas
    3. Haga clic en el Advancedbotón
    4. Establezca General> Types of data to scripten Data onlyo Schema and Datay haga clic en Aceptar
    5. Hacer clic Next
  5. "Página de resumen", haga clic en siguiente
  6. Su secuencia de comandos SQL debe generarse en función de las opciones que estableció en 4.2. Abra este archivo y vea sus datos.
Kevin Brydon
fuente
3

El tipo de datos TEXT es antiguo y no debería usarse más, es una molestia seleccionar datos de una columna TEXT.

ntext, texto e imagen (Transact-SQL)

Los tipos de datos de texto, texto e imagen se eliminarán en una versión futura de Microsoft SQL Server. Evite el uso de estos tipos de datos en nuevos trabajos de desarrollo y planee modificar las aplicaciones que los usan actualmente. Utilice nvarchar (max), varchar (max) y varbinary (max) en su lugar.

debe utilizar TEXTPTR (Transact-SQL) para recuperar los datos de texto.

Consulte también este artículo sobre cómo manejar el tipo de datos de texto .

KM.
fuente
¿Se convertirá la columna para varchar(MAX)evitar que SSMS trunque los datos de ella?
Adamjford
Primero usaría SSMS para generar el script para convertir su columna TEXT a varchar (max). A partir de ahí, podría evaluar si desea convertirlo en una columna XML. En cuanto a los límites de visualización de SSMS, los resultados en la cuadrícula se pueden configurar para mostrar hasta 65,535 caracteres de datos no xml por columna, y hasta una cantidad ilimitada de datos xml (para su información, las columnas de tabla de tipo XML solo pueden almacenar 2 GB). Mientras que los resultados de texto están limitados a 8192 caracteres por columna. Para establecer estos límites máximos predeterminados, simplemente vaya al menú HERRAMIENTAS (en SSMS), luego OPCIONES ... luego CONSULTAR RESULTADOS, luego SERVIDOR SQL, luego RESULTADOS A LA RED o RESULTADOS AL TEXTO.
KM.
3

Parece que el XML puede no estar bien formado. Si ese es el caso, entonces no podrá convertirlo como Xml y dado eso, está limitado en la cantidad de texto que puede devolver en Management Studio. Sin embargo, puede dividir el texto en trozos más pequeños de la siguiente manera:

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

A continuación, deberá volver a combinarlos manualmente.

EDITAR

Parece que hay algunos caracteres en los textdatos que no le gustan al analizador Xml. Puede intentar convertir esos valores en entidades y luego probar el Convert(xml, data)truco. Entonces algo como:

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

(Necesitaba convertir a varchar (max) porque la función de reemplazo no funcionará en las textcolumnas. No debería haber ninguna razón por la que no pueda convertir esas textcolumnas a varchar(max)).

Thomas
fuente
Oh, supongo que debería mencionar que la columna no es XML en absoluto. CONVERTIR la columna a XML es simplemente una solución alternativa que encontré al buscar en Google que alguien más ha usado para sortear el límite que tiene SSMS para recuperar datos de una columna texto varchar(MAX).
Adamjford
1
EDITE su código anterior; Con Tally As (Seleccione ROW_NUMBER () OVER (ORDER BY s1.id) - 1 As Num From sys.sysobjects As s1 Cross Join sys.sysobjects As s2) Seleccione Substring (T1.YourTextCol, T2.Num * 8000 + 1, 8000) De YourTable como T1 Cross Join Tally como T2 donde T2.Num <= Ceiling (datalength (T1.YourTextCol) / 8000) Ordenar por T2.Num
Ian Quigley
El uso TSQLde @IanQuigley basado en esta respuesta funcionó bien para mí. Básicamente, tomé los resultados (terminé siendo 11 registros) y los pegué en el Bloc de notas. Funcionó perfectamente. Necesito guardar este script. Tenía un XML largo y loco que incluía caracteres no válidos.
Atconway
1

Prefiero este simple truco XML que hace que se pueda hacer clic en las columnas en SSMS celda por celda. Con este método, puede ver sus datos rápidamente en la vista tabular de SSMS y hacer clic en celdas particulares para ver el valor completo cuando sean interesantes. Esto es idéntico a la técnica del OP, excepto que evita los errores 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
;
binki
fuente
Tenga en cuenta que algunos caracteres no son válidos en XML 1.0 pero son válidos en NVARCHAR/ VARCHAR. Por ejemplo, el carácter NUL (diferente de NULLcomo valor para el campo). El reparto fallará para cadenas con tales valores incrustados.
binki
1

A partir de SSMS 18.2, ahora puede ver hasta 2 millones de caracteres en los resultados de la cuadrícula. Fuente

Permitir que se muestren más datos (resultado en texto) y se almacenen en celdas (resultado en cuadrícula). SSMS ahora permite hasta 2 millones de caracteres para ambos.

Verifiqué esto con el siguiente código.

DECLARE @S varchar(max) = 'A'

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

SELECT @S as a
Gabe
fuente
1
El número máximo de caracteres es en realidad 2097152 ( en la versión 15.0.18333.0 de SSMS ).
stomy
0

No tienes suerte, creo. El problema no es un problema de nivel de SQL como todas las otras respuestas parecen enfocarse, sino simplemente una de la interfaz de usuario. Management Studio no está diseñado para ser una interfaz de acceso a datos genérica / de propósito general. No está ahí para ser su interfaz, sino su área administrativa, y tiene serias limitaciones para manejar datos binarios y datos de prueba grandes, porque las personas que lo usan dentro del perfil de uso especificado no se encontrarán con este problema.

La presentación de datos de texto grandes simplemente no es el uso planificado.

Su única opción sería una función con valores de tabla que toma la entrada de texto y la corta filas para cada línea, de modo que Management Studio obtenga una lista de filas, no una sola fila.

TomTom
fuente
Siento que esta respuesta es una conjetura en el mejor de los casos, o ¿tiene alguna fuente para el "uso planificado"? Si se trata de un "estudio de gestión" SQL, al menos debería poder mostrarme el contenido de mis bases de datos. Interfaz de usuario absolutamente horrible.
2017
Esta respuesta debe eliminarse ya que ya no es aplicable
Caius Jard