2011-12-05 14 views
10

Wprowadzam informacje o błędach do tabeli tabeli błędów w mojej bazie danych. Mam do tego klasę użytkową:podziały wierszy utracone na serwerze sql

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

To działa dobrze. Jednak gdy próbuję uzyskać dostęp do tej tabeli, linie podziału nie wydają się już obecne.

Gdybym SELECT tabeli:

SELECT * from ErrorLog ORDER BY ErrorDate 

nie istnieją podziały wiersza występuje w dzienniku. Tego rodzaju oczekiwano, ponieważ łamanie linii w wierszach jednoliniowych przerwałoby formatowanie. Jeśli jednak skopiuję dane, znaki podziału linii zostały utracone, a dane są w jednym wierszu.

Jak uzyskać podział wiersza w danych na końcu zapytania, gdy umieszczam podziały wierszy? Nie wiem, czy ciąg znaków został pozbawiony podziałów linii, gdy wejdzie do stołu, czy przeglądarka SQL Server Management Studio usunęła linie podziału.

Typ danych kolumny, w której umieszczane są komunikaty o błędach, to nvarchar(Max), jeśli to robi różnicę.

EDYCJA: Niespodziewanie rozwiązanie Pendri nie zadziałało.

Oto fragment napisu tuż przed przekazaniem do serwera SQL:

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

I tu jest ten sam ciąg kiedy wyodrębnić go od widza siatki w SQL Server Management Studio:

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

Miejsce, w którym powinien znajdować się podział linii, zostało podwójne.

Wszelkie pomysły?

+0

Kiedy mówisz podziały wierszy zostaną utracone, czy to dlatego, że nie są wyświetlane w widoku siatki wyników po uruchomieniu zapytania z SSMS? Uważam, że system SSMS usuwa podziały wierszy w wynikach, nawet podczas kopiowania i wklejania. Można to zweryfikować, rzucając na varbinary i sprawdzając, czy odpowiednie kody znaków są obecne w reprezentacji binarnej, lub pisząc małą aplikację C#. –

Odpowiedz

15

SSMS zastępuje linebreaks ze spacjami w wyjściu siatki. Jeśli użyjesz opcji Drukuj, aby wydrukować wartości (przejdziesz do zakładki komunikatów), to tam zostaną wyświetlone powroty karetki, jeśli zostały zapisane razem z danymi.

przykład:

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

Pierwszy ekran będzie w pojedynczej komórki w siatce bez przerw, drugi zaś drukowanie z przerwą na panelu komunikatów.

Szybki i łatwy sposób wydrukować wartości byłoby wybrać do zmiennej:

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

Świetnie! To działa. Trochę niedoskonałe jest to, aby robić to tylko po to, aby uzyskać dane. – Oliver

1

spróbuj char(13) + char(10) zamiast „\ n” w swojej ciąg (określić stałą i złączyć się z programem SQL)

+0

Czy to zadziałałoby we wszystkich przypadkach, gdybym zrobił coś takiego jak 'message.replace ('\ n', char (13) + char (10))' w mojej metodzie 'ErrorHandler.Error'? – Oliver

+0

Powiedziałbym, dajcie temu wir ;-), ale teoretycznie ... tak ... – penderi

+0

Dane się pojawiają. Problem polega na tym, w jaki sposób SSMS wyświetla i przetwarza dane. –

4

Aktualizacja kilka lat później.

Jak opisano here, jedno rozwiązanie, aby zachować oglądania linebreaks w SSMS jest konwersja wyjście do pliku XML:

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

szczęście, jeśli masz SSMS 2012, nie jest to już problemem, jak podziały wiersza są zatrzymany.

+1

Powinieneś użyć słowa kluczowego "TYPE". Zobacz moją odpowiedź: http://stackoverflow.com/a/30927549/2266979 –

1

I echo David C's answer, z wyjątkiem słów kluczowych "TYPE", aby można było kliknąć, aby otworzyć dane w nowym oknie.

Należy pamiętać, że wszelkie niebezpieczne znaki XML nie będą dobrze działać z żadnym z naszych rozwiązań.

Oto dowód pojęcia:

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; 

Mogę potwierdzić, że podziały wierszy są zachowane podczas kopiowania z siatki w SSMS 2012.

9

Nie ma potrzeby, aby zastąpić ciąg wejściowy \ wyjście, potrzebujesz tylko odebrać poprawną opcję:

Tools -> Options... 

> Query Results 
    > SQL Server 
    > Results to Grid 

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

I nie zapomnij ponownie uruchomić swojego studia zarządzania!

według Charles Gagnon answer

+0

Dzięki. Dobre rozwiązanie! – user2523651

+1

Po zmianie tego ustawienia musiałem zrestartować system SSMS, a następnie zadziałało. Myślę, że to adresuje pytanie bardziej bezpośrednio niż zaakceptowana odpowiedź. – funkwurm

+0

Ta odpowiedź wymaga więcej głosów. p.s. Musisz tylko utworzyć nowe okno zapytania; nie musisz restartować po zmianie opcji. – mcNux

Powiązane problemy