2011-12-05 43 views
10

Tôi đang nhập thông tin lỗi vào bảng ErrorLog trong cơ sở dữ liệu của mình. Tôi có một lớp tiện ích để thực hiện việc này:ngắt dòng bị mất trong máy chủ sql

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

Điều này có hiệu quả. Tuy nhiên, khi tôi cố gắng truy cập vào bảng này, ngắt dòng dường như không còn tồn tại nữa.

Nếu tôi SELECT bảng:

SELECT * from ErrorLog ORDER BY ErrorDate 

không có ngắt dòng hiện trong nhật ký. Đây là loại dự kiến, vì ngắt dòng trong hàng một hàng sẽ phá vỡ định dạng. Tuy nhiên, nếu tôi sao chép dữ liệu ra, các ký tự ngắt dòng đã bị mất và dữ liệu là tất cả trên một dòng.

Làm cách nào để có ngắt dòng trong dữ liệu ở cuối truy vấn khi tôi đặt ngắt dòng? Tôi không biết nếu chuỗi đã bị tước các ngắt dòng khi nó đi vào bảng, hoặc nếu người xem trong SQL Server Management Studio đã tước bỏ các ngắt dòng.

Loại dữ liệu của cột mà thông báo lỗi được đặt là nvarchar(Max), nếu điều đó tạo nên sự khác biệt.

EDIT: Thật bất ngờ, giải pháp của Pendri không hoạt động.

Dưới đây là một đoạn trích của chuỗi ngay trước khi nó đi vào máy chủ SQL:

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

Và đây là chuỗi tương tự khi tôi giải nén nó từ người xem lưới trong SQL Server Management Studio:

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

Nơi ngắt dòng phải được đặt cách nhau gấp đôi.

Bất kỳ ý tưởng nào?

+0

Khi bạn nói ngắt dòng là vì chúng không xuất hiện trong chế độ xem kết quả lưới khi bạn chạy truy vấn từ SSMS? Tôi tin rằng SSMS dải ngắt dòng trong kết quả, ngay cả khi bạn sao chép và dán. Bạn có thể xác minh điều này bằng cách truyền đến varbinary và xem liệu các mã ký tự có liên quan có xuất hiện trong biểu diễn nhị phân hay không bằng cách viết một ứng dụng C# nhỏ. –

Trả lời

15

SSMS thay thế xuống hàng với không gian ở đầu ra lưới. Nếu bạn sử dụng Print để in các giá trị (sẽ chuyển đến tab tin nhắn của bạn) thì các vận chuyển sẽ được hiển thị ở đó nếu chúng được lưu trữ với dữ liệu.

Ví dụ:

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

Ý chí đầu tiên được trưng bày tại một tế bào duy nhất trong mạng lưới mà không phá vỡ, thứ hai sẽ in với nghỉ ngơi để các thông điệp cửa sổ.

Một cách nhanh chóng và dễ dàng để in các giá trị sẽ được chọn vào một biến:

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

Tuyệt vời! Những công việc này. Đó là một chút bất tiện phải làm điều này chỉ để có được dữ liệu ra mặc dù. – Oliver

1

hãy thử sử dụng char(13) + char(10) thay vì '\ n' trong chuỗi của bạn (xác định một hằng số và nối đến sql của bạn)

+0

Nó có hoạt động trong mọi trường hợp nếu tôi đã làm một cái gì đó như 'message.replace ('\ n', char (13) + char (10))' trong phương thức 'ErrorHandler.Error' của tôi? – Oliver

+0

Tôi muốn nói cho nó một whirl ;-) nhưng trong lý thuyết ... yeah .... – penderi

+0

Dữ liệu được đưa vào bảng. Vấn đề là cách SSMS hiển thị và xử lý dữ liệu. –

4

Cập nhật một vài năm sau đó.

Như đã trình bày here, một giải pháp để bảo tồn linebreaks xem trong SSMS là để chuyển đổi đầu ra để XML:

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

May mắn thay, nếu bạn có SSMS 2012, điều này không còn là một vấn đề, như ngắt dòng là giữ lại.

+1

Bạn nên sử dụng từ khóa "TYPE". Xem câu trả lời của tôi: http://stackoverflow.com/a/30927549/2266979 –

1

Tôi echo David C's answer, ngoại trừ bạn nên sử dụng từ khóa "TYPE" để bạn có thể nhấp để mở dữ liệu trong cửa sổ mới.

Lưu ý rằng mọi ký tự XML không an toàn sẽ không hoạt động tốt với một trong các giải pháp của chúng tôi.

Đây là một bằng chứng của khái niệm:

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; 

tôi có thể xác nhận rằng các ngắt dòng được bảo toàn khi sao chép ra một mạng lưới trong SSMS 2012.

9

Không cần phải thay thế chuỗi đầu vào \ ra, bạn chỉ cần chọn đúng tùy chọn:

Tools -> Options... 

> Query Results 
    > SQL Server 
    > Results to Grid 

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

Và đừng quên khởi động lại studio quản lý của bạn!

theo Charles Gagnon answer

+0

Cảm ơn. Giải pháp tốt! – user2523651

+1

Tôi phải khởi động lại SSMS sau khi thay đổi cài đặt này và sau đó nó hoạt động. Tôi nghĩ rằng điều này giải quyết trực tiếp câu hỏi hơn câu trả lời được chấp nhận. – funkwurm

+0

Câu trả lời này cần thêm phiếu bầu. p.s. Bạn chỉ phải tạo cửa sổ truy vấn mới; bạn không phải khởi động lại sau khi thay đổi tùy chọn. – mcNux

Các vấn đề liên quan