2010-05-03 15 views
71

En esta base de datos de SQL Server 2008 (compilación 10.0.1600), hay una tabla Events, que contiene una columna text llamada Details. (Sí, me doy cuenta de que esto debería ser realmente una columna varchar(MAX), pero quien configuró esta base de datos no lo hizo de esa manera.)¿Cómo veo el contenido completo de una columna de texto o varchar (MAX) en SQL Server 2008 Management Studio?

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 grilla en un editor de texto, lo trunca en 43679 caracteres.

que he leído en varios lugares en Internet que usted puede configurar su máximo de caracteres Obtenido de datos XML en Tools > Options > Query Results > SQL Server > Results To Grid a Unlimited, y luego realizar una consulta como esta:

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

(Tenga en cuenta que la los datos es la columna no es XML en absoluto. CONVERT ing la columna de XML no es más que una solución que encontré de buscar en Google que alguien ha utilizado para evitar el límite SSMS tiene de recuperar los datos de una columna text o varchar(MAX).)

Sin embargo, después de configurar la opción anterior, ejecutando la consulta, y haciendo clic en el enlace en el resultado, todavía me sale el siguiente error:

Unable to show XML. The following error happened: Unexpected end of file has occurred. Line 5, position 220160.

One solution is to increase the number of characters retrieved from the server for XML data. To change this setting, on the Tools menu, click Options.

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

+0

que solía tener una utilidad encargo por escrito sólo con el propósito de acceder a los campos de texto. Fue muy molesto – Jaxidian

Respuesta

76

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 esta muestra los resultados de la siguiente manera

enter image description here

clic sobre él se abre 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 < al 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 que estos caracteres están debajo (credit Adam Machanic here).

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

Añadiendo CDATA al enunciado Convert funcionó! Muchas gracias. :) – adamjford

+0

Agregar 'CDATA' puede 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 usaba ese personaje en muchos lugares, bastaba un simple 'REEMPLAZAR (detalles, char (31),' &x1f; ')'. Si tuviera caracteres desconocidos o una gran cantidad de caracteres diferentes para reemplazar, es posible que haya tenido que encontrar otra solución. – Zarepheth

+0

@Zarepheth - La cosa 'CDATA' fue mi primera sugerencia. El último de 'AS [processing-instruction (x)]' lo evita. –

2

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, se puede dividir el texto en partes más pequeñas de este modo:

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, tendría que combinar manualmente de nuevo.

EDITAR

Parece que hay algunos caracteres en los datos text que el analizador XML no le gusta. Podría intentar convertir esos valores en entidades y luego probar el truco Convert(xml, data). Así que algo como:

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

(que necesitaba para echar a varchar (max) debido a que la función de reemplazar no funcionará en text columnas No debería haber ninguna razón por la que no se podía convertir esos text columnas a varchar(max).).

+0

Oh, supongo que debería mencionar que la columna no es XML en absoluto. CONVERTIR 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 de recuperar datos de una columna 'text' o' varchar (MAX) '. – adamjford

+1

EDITAR de su código anterior; Con Tally Como ( Seleccionar ROW_NUMBER() OVER (ORDER BY s1.id) - 1 Como Num De sys.sysobjects como S1 Cruz Ingreso sys.sysobjects Como s2 ) select substring (T1.YourTextCol, T2.Num * 8000 + 1, 8000) De YourTable Como T1 combinación cruzada Tally Como T2 Dónde T2.Num <= Techo (longitud de datos (T1.YourTextCol)/8000) Ordenar Por T2.Num –

+0

Utilizando el 'TSQL' de @IanQuigley basado en esta respuesta funcionó bien para mí. Básicamente tomé los resultados (terminé siendo 11 registros) y simplemente los pegué juntos en el Bloc de notas. Funcionó perfectamente Necesito guardar esta secuencia de comandos Tenía un XML largo y loco que incluía caracteres no válidos. – atconway

2

El tipo de datos de texto es viejo y no debe utilizarse más, es un dolor para seleccionar datos de una columna de texto.

ntext, text, and image (Transact-SQL)

ntext, text, and image data types will be removed in a future version of Microsoft SQL Server. Avoid using these data types in new development work, and plan to modify applications that currently use them. Use nvarchar(max), varchar(max), and varbinary(max) instead.

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

Ver también este artículo en Handling The Text Data Type.

+0

¿La conversión de la columna a 'varchar (MAX)' evitará que SSMS trunque los datos de la misma? – adamjford

+0

Primero usaría SSMS para generar el scrip para convertir su columna TEXT a varchar (max). Desde allí, puede evaluar si desea convertirlo más a una columna XML. En cuanto a los límites de visualización de SSMS, los resultados de la cuadrícula pueden configurarse para mostrar hasta 65.535 caracteres de datos no xml por columna y hasta una cantidad ilimitada de datos xml (fyi, las columnas de tabla de tipo XML solo pueden almacenar 2 GB). Mientras que los resultados para el texto se limitan a 8192 caracteres por columna. Para establecer estos límites máximos predeterminados, simplemente vaya al menú HERRAMIENTAS (en SSMS), luego OPCIONES ... luego QUERY RESULTS, luego SQL Server, luego RESULTS TO GRID o RESULTS TO TEXT. –

0

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 con valores de tabla que toma la entrada de texto y la corta en filas para cada línea, de modo que Management Studio obtiene una lista de filas, no una sola fila.

+0

Siento que esta respuesta es, en el mejor de los casos, una conjetura, o ¿tiene alguna fuente para el "uso planificado"? Si se trata de un "estudio de gestión" SQL, al menos debería ser capaz de mostrarme el contenido de mis bases de datos. Absolutamente horrible UI. – damd

4

La solución más sencilla que he encontrado es hacer copias de seguridad de la mesa y ver la secuencia de comandos. Para ello

  1. Haga clic derecho en su base de datos y elegir Tasks>Generate Scripts...
  2. página "Introducción" clic Next
  3. "Elegir objetos" página
    1. Elija el Select specific database objects y seleccione su mesa.
    2. Haga clic Next
  4. "Establecer opciones de secuencias de comandos" página
    1. Establecer el tipo de salida a Save scripts to a specific location
    2. Seleccionar Save to file y complete las opciones relacionadas
    3. Haga clic en el botón Advanced
    4. Establecer General >Types of data to script a Data only o Schema and Data y haga clic en Aceptar
    5. Haga clic Next
  5. "Summary" haga clic en siguiente
  6. Su secuencia de comandos SQL se debe generar en función de las opciones establecidas en el apartado 4.2. Abra este archivo y vea sus datos.
+0

Gracias, ¡esto funcionó bien! – skiphoppy

28

pude conseguir que esto funcione ...

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

prefiero este sencillo truco de XML que hace que las columnas se puede hacer clic en SSMS sobre una base de 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, '&', '&amp;'), '<', '&lt;') AS XML) Details 
FROM Events e 
WHERE 1=1 
AND e.EventID BETWEEN 13920 AND 13930 
; 
6

Una solución temporal es hacer clic 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í.

Workaround

0

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

En la ventana de consulta,

  1. opciones de consulta establecido en "Resultados a la cuadrícula", ejecutar la consulta
  2. Haga clic derecho sobre la pestaña de resultados en la esquina de rejilla, guardar los resultados como los archivos

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

Results in a file

Cuestiones relacionadas