Потеря строк в sql-сервере
Я ввожу информацию об ошибках в таблицу ErrorLog в моей базе данных. Для этого у меня есть класс утилиты:
ErrorHandler.Error("Something has broken!!\n\nDescription");
Это прекрасно работает. Однако, когда я пытаюсь получить доступ к этой таблице, разрыв строки больше не кажется присутствующим.
Если я SELECT
таблица:
SELECT * from ErrorLog ORDER BY ErrorDate
в журнале нет разрывов строк. Это отчасти ожидается, так как разрывы строк в однострочных строках нарушат форматирование. Однако, если я копирую данные, символы разрыва строки теряются, а данные все в одной строке.
Как получить разрывы строк в данных в конце моего запроса, когда я помещаю разрывы строк? Я не знаю, была ли строка лишена разрывов строк при входе в таблицу или если средство просмотра в SQL Server Management Studio удалило разрывы строк.
Тип данных столбца, в который помещаются сообщения об ошибках, составляет nvarchar(Max)
, если это имеет значение.
EDIT: Неожиданно решение Pendri не работает.
Вот фрагмент строки непосредственно перед тем, как она переходит на SQL-сервер:
POST /ipn/paymentResponse.ashx?installation=272&msgType=result HTTP/1.0\n\rContent-Length: 833\n\rContent-Type:
И вот такая же строка, когда я извлекаю ее из средства просмотра сетки в SQL Server Management Studio:
POST /ipn/paymentResponse.ashx?installation=272&msgType=result HTTP/1.0 Content-Length: 833 Content-Type:
Место разрыва строки должно быть двойным.
Любые идеи?
Ответы
Ответ 1
SSMS заменяет разрывы строк пробелами в выходном файле сетки. Если вы используете Print для печати значений (перейдите на вкладку сообщений), тогда возврат каретки будет отображаться там, если они были сохранены с данными.
Пример:
SELECT 'ABC' + CHAR(13) + CHAR(10) + 'DEF'
PRINT 'ABC' + CHAR(13) + CHAR(10) + 'DEF'
Первый будет отображаться в одной ячейке в сетке без разрывов, второй будет печатать с разбиением на панель сообщений.
Быстрый и простой способ печати значений - это выбрать в переменную:
DECLARE @x varchar(100);
SELECT @x = 'ABC' + CHAR(13) + CHAR(10) + 'DEF';
PRINT @x;
Ответ 2
Не нужно заменять ввод строки\вывод, вам нужно просто выбрать правильный вариант:
Tools -> Options...
> Query Results
> SQL Server
> Results to Grid
set "Retain CR\LF on copy or save" to true.
И не забудьте перезапустить свою студию управления!
Чарльз Ганьон ответил
Ответ 3
Обновите пару лет спустя.
Как описано здесь, одним из способов сохранить просмотр строк в SSMS является преобразование вывода в XML:
SELECT * FROM (
SELECT * from ErrorLog ORDER BY ErrorDate
) AS [T(x)] FOR XML PATH
К счастью, если у вас есть SSMS 2012, это уже не проблема, так как разрывы строк сохраняются.
Ответ 4
попробуйте использовать char(13) + char(10)
вместо '\n' в вашей строке (определите константу и соединитесь с вашим sql)
Ответ 5
I echo Давид C ответ, за исключением того, что вы должны использовать ключевое слово TYPE, чтобы вы могли щелкнуть, чтобы открыть данные в новом окне.
Обратите внимание, что любые небезопасные символы XML не будут работать с любым из наших решений.
Вот доказательство концепции:
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;
Я могу подтвердить, что разрывы строк сохраняются при копировании из сетки в SSMS 2012.
Ответ 6
В SQL Server 2008 не предусмотрено значение "Сохранить CR\LF при копировании или сохранении" в значение "истина".
В этой проблеме я заменил char (13) на "\ r" и заменил char (10) на "\n", как показано ниже.
REPLACE(REPlACE([COLUMN_NAME],char(13), '\r'),CHAR(10),'\n')
И в коде снова я заменил "\ r\n" тегом break.
Я работал таким образом, поскольку в SQL 2008 не было ни одной опции, как упоминалось выше. Этот ответ может быть альтернативой, хотя.
Спасибо