2011-12-05 17 views
10

Estoy ingresando información de error en una tabla ErrorLog en mi base de datos. Tengo una clase de utilidad para hacer esto:saltos de línea perdidos en el servidor sql

ErrorHandler.Error("Something has broken!!\n\nDescription"); 

Esto funciona bien. Sin embargo, cuando intento acceder a esta tabla, los saltos de línea ya no parecen estar presentes.

Si SELECT la tabla:

SELECT * from ErrorLog ORDER BY ErrorDate 

No hay saltos de línea presente en el registro. Esto es algo esperado, ya que los saltos de línea en filas de una línea romperían el formato. Sin embargo, si copio los datos, los caracteres de salto de línea se han perdido y los datos están todos en una línea.

¿Cómo obtengo saltos de línea en los datos al final de mi consulta cuando pongo los saltos de línea? No sé si la cadena ha sido despojada de saltos de línea cuando entra en la tabla o si el visor de SQL Server Management Studio ha eliminado los saltos de línea.

El tipo de datos de la columna en la que se escriben los mensajes de error es nvarchar(Max), si eso hace la diferencia.

EDIT: Inesperadamente, la solución de Pendri no funcionó.

He aquí un extracto de la cadena justo antes de que pase al servidor SQL:

POST /ipn/paymentResponse.ashx?installation=272&msgType=result HTTP/1.0\n\rContent-Length: 833\n\rContent-Type: 

Y aquí es la misma cadena cuando extraerlo del visor de red en SQL Server Management Studio:

POST /ipn/paymentResponse.ashx?installation=272&msgType=result HTTP/1.0 Content-Length: 833 Content-Type: 

El lugar donde debería estar el salto de línea ha sido espaciado doble.

¿Alguna idea?

+0

Cuando dice saltos de línea se pierden, es que debido a que no aparecen en la vista de cuadrícula de resultados cuando se ejecuta la consulta desde SSMS? Creo que SSMS elimina los saltos de línea en los resultados, incluso cuando los copia y los pega. Podrías verificar esto lanzando a varbinary y ver si los códigos de caracteres relevantes están presentes en la representación binaria, o escribiendo una pequeña aplicación C#. –

Respuesta

15

SSMS reemplaza con espacios saltos de línea en la salida de la rejilla. Si usa Imprimir para imprimir los valores (irá a la pestaña de mensajes), los retornos de carro se mostrarán allí si se almacenaron con los datos.

Ejemplo:

SELECT 'ABC' + CHAR(13) + CHAR(10) + 'DEF' 
PRINT 'ABC' + CHAR(13) + CHAR(10) + 'DEF' 

La primera pantalla voluntad en una sola celda de la cuadrícula sin pausas, la segunda imprimirá con un descanso para el panel de mensajes.

Una forma rápida y fácil de imprimir los valores sería seleccionar en una variable:

DECLARE @x varchar(100); 
SELECT @x = 'ABC' + CHAR(13) + CHAR(10) + 'DEF'; 
PRINT @x; 
+0

¡Genial! Esto funciona. Sin embargo, es un poco incómodo tener que hacer esto solo para obtener datos. – Oliver

1

trate de usar en lugar de char(13) + char(10) '\ n' en la cadena (definir una constante y concatenar a su SQL)

+0

¿Funcionaría en todos los casos si hiciera algo como 'message.replace ('\ n', char (13) + char (10))' en mi método 'ErrorHandler.Error'? – Oliver

+0

Yo diría darle un giro ;-) pero en teoría ... sí .... – penderi

+0

Los datos están llegando a la mesa. El problema es la forma en que SSMS muestra y maneja los datos. –

4

actualización de un par de años más tarde.

Como se describe here, una solución para conservar los saltos de línea de visión en SSMS es convertir la salida a XML:

SELECT * FROM (
    SELECT * from ErrorLog ORDER BY ErrorDate 
) AS [T(x)] FOR XML PATH 

Afortunadamente, si usted tiene SSMS 2012, esto ya no es un problema, como saltos de línea son retenido

+1

Debe usar la palabra clave "TYPE". Ver mi respuesta: http://stackoverflow.com/a/30927549/2266979 –

1

Me echo David C's answer, excepto que debe usar la palabra clave "TYPE" para que pueda hacer clic para abrir los datos en una nueva ventana.

Tenga en cuenta que los caracteres XML no seguros no funcionarán bien con ninguna de nuestras soluciones.

Aquí es una prueba de concepto:

DECLARE @ErrorLog TABLE (ErrorText varchar(500), ErrorDate datetime); 
INSERT INTO @ErrorLog (ErrorText, ErrorDate) VALUES 
    ('This is a long string with a' + CHAR(13) + CHAR(10) + 'line break.', getdate()-1), 
    ('Another long string with' + CHAR(13) + CHAR(10) + '<another!> line break.', getdate()-2); 
SELECT 
    (
     SELECT ErrorText AS '*' 
     FOR XML PATH(''), TYPE 
    ) AS 'ErrorText', 
    ErrorDate 
FROM  @ErrorLog 
ORDER BY ErrorDate; 

puedo confirmar que los saltos de línea se conservan cuando se copia de una cuadrícula en SSMS 2012.

9

No es necesario reemplazar cadena de entrada \ salida, solo tiene que elegir la opción correcta:

Tools -> Options... 

> Query Results 
    > SQL Server 
    > Results to Grid 

set "Retain CR\LF on copy or save" to true. 

Y no olvide reiniciar su estudio de administración.

según Charles Gagnon answer

+0

Gracias. ¡Buena solución! – user2523651

+1

Tuve que reiniciar SSMS después de cambiar esta configuración y luego funcionó. Creo que esto aborda la pregunta más directamente que la respuesta aceptada. – funkwurm

+0

Esta respuesta necesita más votos. PD. Solo debe crear una nueva ventana de consulta; no tiene que reiniciar después de cambiar la opción. – mcNux

Cuestiones relacionadas