tabla - ¿Cómo veo el contenido completo de una columna de texto o varchar(MAX) en SQL Server 2008 Management Studio?
sql server text length (9)
¿Has probado esta solución simple? ¡A solo 2 clics de distancia!
En la ventana de consulta,
- establece las opciones de consulta en "Resultados a la cuadrícula", ejecuta tu consulta
- Haga clic derecho en la pestaña de resultados en la esquina de la cuadrícula, guarde los resultados como cualquier archivo
¡Obtendrá todo el texto que desea ver en el archivo! Puedo ver 130,556 caracteres para mi resultado de un campo varchar (MAX)
En esta base de datos en vivo de SQL Server 2008 (compilación 10.0.1600), hay una tabla de Events
, que contiene una columna de text
llamada Details
. (Sí, me doy cuenta de que esto en realidad debería ser una columna varchar(MAX)
, pero quien configuró esta base de datos no lo hizo de esa manera).
Esta columna contiene registros de excepciones muy grandes 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 en un editor de texto, lo trunca en 43679 caracteres.
He leído en varias ubicaciones de Internet que puede establecer sus Caracteres máximos recuperados para datos XML en Tools > Options > Query Results > SQL Server > Results To Grid
en ilimitado y luego realizar una consulta como esta:
select Convert(xml, Details) from Events
where EventID = 13920
(Tenga en cuenta que la columna data no es XML. CONVERT
la columna en XML es simplemente una solución que encontré en Google que alguien más ha utilizado para superar el límite que SSMS tiene para recuperar datos de un text
o varchar(MAX)
columna.)
Sin embargo, después de establecer la opción anterior, ejecutar la consulta y hacer clic en el enlace en el resultado, sigo recibiendo el siguiente error:
No se puede mostrar XML. Se produjo el siguiente error: Se ha producido 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 esta información? ¿La conversión de la columna a varchar(MAX)
solucionaría mis problemas?
El tipo de datos TEXTO es antiguo y ya no se debe usar, es difícil seleccionar datos de una columna de TEXTO.
ntext, texto e imagen (Transact-SQL)
Los tipos de datos ntext, text e image se eliminarán en una versión futura de Microsoft SQL Server. Evite utilizar estos tipos de datos en el nuevo trabajo de desarrollo y planee modificar las aplicaciones que actualmente los utilizan. Use nvarchar (max), varchar (max) y varbinary (max) en su lugar.
necesita usar TEXTPTR (Transact-SQL) para recuperar los datos de texto.
Consulte también este artículo sobre Manejo del tipo de datos de texto .
Estás de suerte, creo. El problema no es un problema de nivel SQL, ya que todas las otras respuestas parecen enfocarse, sino simplemente una de la interfaz de usuario. Management Studio no pretende ser una interfaz de acceso a datos generales / genérica. No está allí 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.
Presentar datos de texto grandes simplemente no es el uso planificado.
Su única opción sería una función de valor de tabla que toma la entrada de texto y la corta por cada línea, de modo que Management Studio obtenga una lista de filas, no una sola fila.
La solución más simple que encontré es hacer una copia de seguridad de la tabla y ver el script. Para hacer esto
- Haga clic con el botón derecho en su base de datos y seleccione
Tasks
>Generate Scripts...
- Página "Introducción", haga clic en
Next
- Página "Elegir objetos"
- Elija
Select specific database objects
y seleccione su tabla. - Haga clic en
Next
- Elija
- Página "Establecer opciones de scripting"
- Establecer el tipo de salida para
Save scripts to a specific location
- Seleccione
Save to file
y complete las opciones relacionadas - Haga clic en el botón
Advanced
- Establezca
General
>Types of data to script
aData only
oSchema and Data
y haga clic en Aceptar - Haga clic en
Next
- Establecer el tipo de salida para
- "Página de resumen" haga clic en siguiente
- Su script sql debe generarse en función de las opciones que establece en 4.2. Abra este archivo y vea sus datos.
Parece que el Xml puede no estar bien formado. Si ese es el caso, no podrá convertirlo como Xml y, dado que, tiene limitaciones en la cantidad de texto que puede devolver en Management Studio. Sin embargo, puedes dividir el texto en fragmentos más pequeños como ese:
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
Entonces necesitaría combinarlos manualmente de nuevo.
EDITAR
Parece que hay algunos caracteres en los datos de text
que no le gustan al analizador Xml. Puede intentar convertir esos valores en entidades y luego probar el truco Convert(xml, data)
. Entonces algo así como:
Update Table
Set Data = Replace(Cast(Data As varchar(max)),''<'',''<'')
(Necesita lanzar a varchar (max) porque la función de reemplazo no funcionará en las columnas de text
. No debería haber ninguna razón por la que no pueda convertir esas columnas de text
a varchar(max)
.)
Prefiero este simple hack XML que hace que las columnas puedan hacer clic 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 son interesantes. Esto es idéntico a la técnica de OP excepto que evita los errores de XML.
SELECT
e.EventID
,CAST(REPLACE(REPLACE(e.Details, ''&'', ''&''), ''<'', ''<'') AS XML) Details
FROM Events e
WHERE 1=1
AND e.EventID BETWEEN 13920 AND 13930
;
Pude hacer que esto funcionara ...
SELECT CAST(''<![CDATA['' + LargeTextColumn + '']]>'' AS XML) FROM TableName;
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.
DECLARE @S varchar(max) = ''A''
SET @S = REPLICATE(@S,100000) + ''B''
SELECT @S as [XML_F52E2B61-18A1-11d1-B105-00805F49916B]
En SSMS 2012 y 2014, muestra los resultados de la siguiente manera
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 todas 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 con la conversión de SQL Server <
a <
etc. o fallando debido a estos caracteres está por debajo ( 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('''')