2009-06-04 21 views
40

En SQL Server 2005 estoy intentando consultar una columna varchar (MAX) que tiene algunas filas con datos de texto que exceden el 8192. Sin embargo, en Management Studio tengo Herramientas -> Opciones -> Resultados de la consulta -> Resultados a texto -> Número máximo de caracteres que se muestran en cada columna = 8192, que es un máximo. De acuerdo con esto, parece que el truncamiento en estas filas ocurre solo debido a la limitación impuesta por la salida de texto.Truncamiento de SQL Server y 8192 limitación

Lo único que veo para evitar esto es usar una función SUBSTRING para tomar los primeros 8000 caracteres, luego los 8000 caracteres siguientes, etc. etc. Pero esto es feo y propenso a errores.

Debo mencionar que SSIS y BCP no son opciones para mí.

¿Alguien tiene una mejor sugerencia? ¡Gracias!

+1

¿Le preocupa con la forma en la salida está exhibiendo en el Analizador de consultas? Si solo lo estás usando para revisar los datos, entonces no me obsesionaré demasiado con el código "propenso a errores" y "feo". Si lo está utilizando para el trabajo de producción, ese es otro problema. –

+0

Tom: No estoy solo mirando datos. Estoy usando el resultado de la consulta para generar nuevas llamadas a procedimientos almacenados para un servidor remoto, por lo que el resultado debe ser 'perfecto'. –

+1

¿Pero por qué usar SSMS para ejecutar la consulta? ¿Qué ocurre si ejecuta la misma consulta desde un programa? –

Respuesta

57

Puede exportar los datos a un archivo plano que no se truncará. Para ello:

  1. Haga clic derecho en la base de datos
  2. Haga clic en Tareas -> Exportar datos
  3. seleccionar la fuente de datos (por defecto debería estar bien)
  4. elegir la opción "Destino de archivo plano" para el tipo de destino.
  5. Elija un nombre de archivo para la salida.
  6. Por "Especificar copia de tabla o consulta", elegir la opción "Escribir una consulta para especificar los datos para transferir"
  7. Pega en su consulta

pasos restantes deben explicarse por sí misma. Esto generará el archivo en texto y puede abrirlo en su editor de texto favorito.

+0

+1 para una solución que funciona sin tener que escribir una herramienta personalizada. Necesitaba exportar datos XML sin cambiar el formato (espaciado), por lo que exportar como XML no era una opción. – mlhDev

+0

Esta debería ser la respuesta aceptada. –

+0

Gracias @Torre .. me salvó el día :) –

0

El truncamiento de lo que está hablando solo ocurre en Management Studio. Si tira de la columna a otra aplicación, no se truncará.

No hay forma de que esté utilizando el Analizador de consultas para hablar con SQL Server 2005. ¿Quiere decir Management Studio?

+0

Creo que se refiere a Management Studio. Si cambia a "Resultados a cuadrícula", muestra el máximo por columna como 65535. Sin embargo, no estoy seguro de si eso lo acercará más, parece que está intentando codificar gen en SQL. – GalacticCowboy

+0

Lo siento, me refiero a Management Studio. –

0

Si tuviera una opción, la consulta devolvería los datos como "Para XML Auto" o "Para XML en bruto" o "Para XML explícito" de esa manera las limitaciones son mucho más altas y puede hacer mucho más con las superadas resultados.

+0

Esto también trunca la salida ... –

+0

@Jaco - Pero puede configurar el límite XML en SSMS para evitar esto. Ver mi respuesta –

4

Mi solución fue un poco rotonda, pero me llegó allí (siempre y cuando la salida es inferior a 65535 caracteres) :

  1. En SQL Server Management Studio, establece el límite para los resultados de la red a 65535 (Herramientas> Opciones> resultados de la consulta SQL Server>> resultados> a la cuadrícula de datos no XML)
  2. Ejecutar la consulta, la salida a la red
  3. Haga clic derecho en los resultados, elegir la opción "Guardar los resultados como ..." y guarde los resultados en un archivo
  4. Abra el archivo en el bloc de notas o similar para obtener la salida

ACTUALIZACIÓN: Para demostrar que esto funciona, aquí hay algo de SQL que selecciona una sola columna de 100.000 caracteres. Si guardo el resultado de la grilla en un archivo csv, todos los 100,000 caracteres están sin truncamiento.

DECLARE @test nvarchar(MAX), @i int, @line nvarchar(100) 
SET @test = ''; SET @i = 100 
WHILE @i < 100000 
BEGIN 
    SET @test = @test + STUFF(REPLICATE('_', 98) + CHAR(13) + CHAR(10), 1, LEN(CAST(@i AS nvarchar)), CAST(@i AS nvarchar)) 
    SET @i = @i + 100 
END 
SELECT @test 

Notas:

  1. no parece hacer ninguna diferencia lo que el ajuste de la longitud de caracteres es, como yo ¡Originalmente se pensaba.
  2. Estoy usando SQL 2008 R2 (el servidor y Management Studio)
  3. Parece que no importa si la columna larga se almacena en una variable local (como en este ejemplo), o se selecciona desde una tabla real
+1

Esto no funciona. El archivo aún tiene datos truncados. – SFun28

+0

Lamento escuchar que no funcionó para ti. He agregado un código que muestra cómo probé que funciona, y algunas notas sobre las condiciones en las que sé que funciona. –

+1

No funciona para mí tampoco. MS SQL Management Studio 2008 R2. –

0

normalmente utilizo XML para obtener enormes cadena de depuración como salida (usando instrumento de prueba de Lucas):

declare @test nvarchar(max), @i int, @line nvarchar(100) 
    set @test = ''; set @i = 100 
    while @i < 100000 
    begin 
     set @test = @test + stuff(replicate('_', 98) + char(13) + char(10), 1, len(cast(@i as nvarchar)), cast(@i as nvarchar)) 
     set @i = @i + 100 
    end 
    -- ctrl+d for "results to grid" then click the xml output 
    --select cast('<root>' + @test + '</root>' as xml) 

-- revised 
select @test for xml path(''), type; 
+0

Sopla si '@ test' contiene' 2 <3' –

+0

Buen punto. Puedes dejar que xml path los reemplace ... aunque no estoy seguro de que eso sea lo que buscas. Al menos sin explosión :) Verifique los pls de revisión. –

+0

¡No explotar pero altera el resultado! –

25

también uso de XML, pero a slightly different method que se pone alrededor de la mayoría de los problemas con XML entitisation.

declare @VeryLongText nvarchar(max) = ''; 

SELECT top 100 @VeryLongText = @VeryLongText + ' 

' + OBJECT_DEFINITION(object_id) 
FROM sys.all_objects 
WHERE type='P' and is_ms_shipped=1 

SELECT LEN(@VeryLongText) 

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

PRINT @VeryLongText /*WILL be truncated*/ 

¡Asegúrese de que el límite de "datos XML" en SSMS sea lo suficientemente alto!

Screenshot

+2

Claramente la mejor solución. –

+0

¿hay alguna manera de que los datos no XML se muestren como ilimitados y la exención del límite? Puedo ver que el límite inferior es 30 y más es 65535. – pordi

+0

@BabekoofCoder - Desafortunadamente no. De ahí la necesidad de que el casting no xml sea una solución XML. –

3

Me encontré con esto tratando de exportar XML. Esta es la solución que utilicé:

Seleccione la opción Resultado para cuadrícula, haga clic derecho en el enlace que aparece en el panel Resultados, luego seleccione Guardar resultados como, elija el tipo de archivo Todos los archivos, dé un nombre al archivo y haga clic Salvar. Todos los datos xml se guardan correctamente en un archivo.

Estoy usando SSMS 10, y no puedo conseguir que la solución de Torre funcione. El asistente de exportación mantuvo pensando columna de entrada era una imagen:

el tipo de datos para "columna de entrada 'XML_F52E2B61-18A1-11d1-B105-00805F49916B' (26)" es DT_IMAGE

+0

Tuve ese problema 'DT_IMAGE' también pero lo solucioné agregando otro', type', an '' select() externo como columnname' alrededor de mi declaración de generación de XML y marcando la casilla de verificación Unicode en el asistente de exportación. – Nathan

0

En SSMS si selecciona los datos desde una fila, está limitada a una pequeña cantidad de caracteres, pero si edita datos desde una fila, el valor completo estará allí. Puede que no siempre esté allí, pero si ctrl-a, ctrl-c luego lo pasa en un editor, todo estará allí.

0

Otra solución alternativa, use HeidiSql para estas consultas complicadas. No tiene los límites en la longitud del campo.

2

¿Has probado esta solución simple? ¡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)

Just Two Clicks away!