Làm cách nào để nhận SQLCMD chỉ xuất lỗi và cảnh báo?


8

Làm thế nào bạn có thể nhận SQLCMD, khi thực thi tệp tập lệnh SQL, để chỉ xuất ra bất kỳ lỗi hoặc cảnh báo nào mà nó gặp phải?

Tôi về cơ bản không muốn thông tin dựa trên thông tin được xuất ra.


Hmm, trong một ứng dụng khác, chúng tôi có thể chuyển hướng đầu ra lỗi 2> Err.txt, nhưng có vẻ như SQLCMDkhông phân chia đầu ra của nó.
Jon của tất cả các giao dịch

2
@Jonof ALLTrades Theo mặc định có, SQLCMD gửi tất cả đầu ra tới thiết bị xuất chuẩn . Tuy nhiên, bạn có thể hướng dẫn SQLCMD gửi lỗi đến thiết bị lỗi thông qua -r0chuyển đổi dòng lệnh, trong trường hợp đó chúng có thể được chuyển hướng đến một tệp bằng cách sử dụng 2>hoặc chúng có thể được hiển thị trong khi các tin nhắn thông thường được chuyển hướng qua >. Xin vui lòng xem câu trả lời của tôi để biết chi tiết.
Solomon Rutzky

Câu trả lời:


4

Theo mặc định, SQLCMD gửi tất cả các thông báo không lỗi và thông báo lỗi đến thiết bị xuất chuẩn . Do đó, cố gắng chuyển hướng đầu ra sẽ không giúp đỡ.

Điều đầu tiên bạn cần làm để chỉ nhận một hoặc một loại thông báo khác (lỗi hoặc không lỗi) là yêu cầu SQLCMD phân tách chúng bằng cách gửi các thông báo lỗi (mức độ nghiêm trọng 11 trở lên) đến stderr . Bạn làm điều này bằng cách sử dụng -rcông tắc dòng lệnh, chỉ định 0làm tùy chọn cho công tắc đó (tức là -r0). Tại thời điểm này, không có sự khác biệt rõ ràng về việc chạy SQLCMD và xem các thông báo thuộc bất kỳ loại nào được hiển thị trên màn hình.

Phần tiếp theo là lọc ra các tin nhắn thông thường sẽ xuất hiện . Điều này có thể được thực hiện bằng cách chuyển hướng các thông báo xuất chuẩn đến một nơi nào đó thông qua >, nhưng đến đâu? Bạn có thể làm > file.txt, nhưng tôi nghi ngờ bạn muốn có một tệp tin nhắn mà bạn không muốn bắt đầu. May mắn thay, DOS có NULtừ khóa (đó không phải là một loại: nó có một L, không phải hai) hoạt động như /dev/nulltrong Unix. Có nghĩa là bạn có thể sử dụng các mục sau để chuyển hướng đầu ra đến hư không : > NUL.

Sau đây sẽ thực thi PRINTlệnh và hiển thị không có đầu ra vì không có lỗi nào được tạo và không có tệp nào được tạo có chứa đầu ra của PRINTlệnh:

CD %TEMP%

SQLCMD -E -Q "print 1;" -r0 > NUL

Nhưng sau đây sẽ hiển thị một thông báo lỗi vì chúng không được chuyển hướng đến NUL:

CD %TEMP%

SQLCMD -E -Q "print a;" -r0 > NUL

Trả về:

Msg 128, Level 15, State 1, Server DALI, Line 1
The name "a" is not permitted in this context. Valid expressions are constants,
constant expressions, and (in some contexts) variables. Column names are not permitted.

1

Sau đây sẽ hoạt động:

sqlcmd -U user -P pass -S Server -Q "sp_who" -r0 1> test.log

Đầu ra từ truy vấn sẽ được đưa vào nhật ký và không có gì được in trên màn hình.

Thêm chi tiết tại bài viết MSDN trên sqlcmd .


Điều này thực sự không hoạt động theo yêu cầu "Về cơ bản tôi không muốn các thông điệp dựa trên thông tin được xuất ra" (nhấn mạnh của tôi). Vấn đề là -r1gửi tất cả tin nhắn đến stderr , bao gồm cả PRINTRAISERROR('', 10, 1)tin nhắn. Bạn cần sử dụng -r0để giữ cho các thông báo thông tin thông thường đó sẽ xuất hiện để chúng được chuyển hướng đến test.log .
Solomon Rutzky

1
@srutzky Cảm ơn, đã sửa đổi câu trả lời của tôi để phản ánh nhận xét của bạn.
LowlyDBA

0

Tìm thấy điều này trên SQLServerCentral

sqlcmd -E -i"install.sql" -r1 2> install-err.log 1> install.log

http://www.sqlservercentral.com/Forums/Topic536968-146-1.aspx


Điều này thực sự không hoạt động theo yêu cầu "Về cơ bản tôi không muốn các thông điệp dựa trên thông tin được xuất ra" (nhấn mạnh của tôi). Vấn đề là -r1gửi tất cả tin nhắn đến stderr , bao gồm cả PRINTRAISERROR('', 10, 1)tin nhắn. Bạn cần sử dụng -r0để giữ cho các thông báo thông tin thông thường đó sẽ xuất hiện để chúng được chuyển hướng đến install.log .
Solomon Rutzky
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.