Bagaimana cara mendapatkan SQLCMD hanya menghasilkan kesalahan dan peringatan?

8

Bagaimana Anda bisa mendapatkan SQLCMD, ketika mengeksekusi file skrip SQL, untuk hanya menghasilkan kesalahan atau peringatan yang ditemui?

Saya pada dasarnya tidak ingin pesan berbasis informasi menjadi keluaran.

bytedev
sumber
Hmm, di aplikasi lain kita bisa mengarahkan output kesalahan 2> Err.txt, tetapi sepertinya SQLCMDtidak membagi outputnya.
Jon of All Trades
2
@JonofAllTrades Secara default ya, SQLCMD mengirim semua output ke stdout . Namun, Anda dapat menginstruksikan SQLCMD untuk mengirim kesalahan ke stderr melalui -r0saklar baris perintah, dalam hal ini mereka dapat diarahkan ke file menggunakan 2>, atau mereka dapat ditampilkan saat pesan biasa dialihkan melalui >. Silakan lihat jawaban saya untuk detailnya.
Solomon Rutzky

Jawaban:

4

Secara default, SQLCMD mengirim semua pesan non-kesalahan dan pesan kesalahan ke stdout . Oleh karena itu, berusaha mengarahkan output tidak akan membantu.

Hal pertama yang perlu Anda lakukan untuk mendapatkan hanya satu atau jenis pesan lainnya (kesalahan atau non-kesalahan) adalah memberi tahu SQLCMD untuk memisahkannya dengan mengirim pesan kesalahan (tingkat keparahan 11 atau lebih tinggi) ke stderr . Anda melakukan ini dengan menggunakan -rsaklar baris perintah, menentukan 0sebagai opsi untuk saklar itu (yaitu -r0). Pada titik ini tidak ada perbedaan yang terlihat dalam hal menjalankan SQLCMD dan melihat pesan jenis apa pun yang ditampilkan di layar.

Bagian selanjutnya adalah memfilter pesan biasa yang akan stdout . Ini dapat dilakukan dengan mengarahkan pesan stdout ke suatu tempat melalui >, tetapi ke mana? Anda bisa melakukannya > file.txt, tetapi saya ragu Anda menginginkan file pesan yang tidak ingin Anda mulai. Untungnya, DOS memiliki NULkata kunci (yang bukan salah ketik: ia memiliki satu L, bukan dua) yang berfungsi seperti /dev/nulldi Unix. Berarti Anda dapat menggunakan berikut untuk output redirect ke mana-mana: > NUL.

Berikut ini akan menjalankan PRINTperintah dan tidak menunjukkan output karena tidak ada kesalahan yang dihasilkan, dan tidak ada file yang dibuat yang akan berisi output dari PRINTperintah:

CD %TEMP%

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

Tetapi yang berikut ini menampilkan pesan kesalahan karena itu tidak diarahkan ke NUL:

CD %TEMP%

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

Pengembalian:

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.
Solomon Rutzky
sumber
1

Berikut ini akan berfungsi:

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

Output dari query akan dimasukkan ke dalam log dan tidak ada yang dicetak di layar.

Lebih detail di artikel MSDN di sqlcmd .

LowlyDBA
sumber
Ini tidak benar-benar berfungsi sesuai dengan yang diminta "Saya pada dasarnya tidak ingin pesan berbasis informasi menjadi output" (penekanan saya). Masalahnya adalah bahwa -r1mengirim semua pesan ke stderr , termasuk PRINTdan RAISERROR('', 10, 1)pesan. Anda perlu menggunakan -r0untuk menjaga agar pesan-pesan info reguler tetap stdout sehingga mereka diarahkan ke test.log .
Solomon Rutzky
1
@srutzky Terima kasih, mengubah jawaban saya untuk mencerminkan komentar Anda.
LowlyDBA
0

Menemukan ini di SQLServerCentral

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

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

Alf47
sumber
Ini tidak benar-benar berfungsi sesuai dengan yang diminta "Saya pada dasarnya tidak ingin pesan berbasis informasi menjadi output" (penekanan saya). Masalahnya adalah bahwa -r1mengirim semua pesan ke stderr , termasuk PRINTdan RAISERROR('', 10, 1)pesan. Anda perlu menggunakan -r0untuk menjaga agar pesan-pesan info biasa tetap stdout sehingga mereka diarahkan untuk menginstal.log .
Solomon Rutzky