Saya memiliki prosedur tersimpan yang sangat lama berjalan di SQL Server 2005 yang saya coba debug, dan saya menggunakan perintah 'cetak' untuk melakukannya. Masalahnya adalah, saya hanya mendapatkan pesan kembali dari SQL Server di akhir sproc saya - Saya ingin dapat menyiram buffer pesan dan melihat pesan-pesan ini segera selama runtime sproc, daripada di bagian paling awal akhir.
sql-server
tsql
printing
Erik Forbes
sumber
sumber
Jawaban:
Gunakan
RAISERROR
fungsinya:Anda seharusnya tidak sepenuhnya mengganti semua cetakan Anda dengan raiserror. Jika Anda memiliki loop atau kursor besar di suatu tempat, lakukan sekali atau dua kali per iterasi atau bahkan setiap beberapa iterasi.
Juga: Saya pertama kali belajar tentang RAISERROR di tautan ini, yang sekarang saya anggap sebagai sumber definitif penanganan SQL Server Error dan pasti patut dibaca:
http://www.sommarskog.se/error-handling-I.html
sumber
Membangun jawaban oleh @ JoelCoehoorn, pendekatan saya adalah meninggalkan semua pernyataan PRINT saya di tempat, dan cukup ikuti mereka dengan pernyataan RAISERROR untuk menyebabkan flush.
Sebagai contoh:
Keuntungan dari pendekatan ini adalah bahwa pernyataan PRINT dapat menggabungkan string, sedangkan RAISERROR tidak bisa. (Jadi bagaimanapun Anda memiliki jumlah baris kode yang sama, seperti Anda harus mendeklarasikan dan mengatur variabel untuk digunakan dalam RAISERROR).
Jika, seperti saya, Anda menggunakan AutoHotKey atau SSMSBoost atau alat yang setara, Anda dapat dengan mudah mengatur pintasan seperti "] flush" untuk memasukkan baris RAISERROR untuk Anda. Ini menghemat waktu Anda jika itu adalah baris kode yang sama setiap kali, yaitu tidak perlu dikustomisasi untuk menampung teks atau variabel tertentu.
sumber
RAISERROR()
mendukungprintf()
interpolasi string gaya. Misalnya, jika@MyVariableName
adalah jenis stringish (misalnya,VARCHAR(MAX)
,NVARCHAR(MAX)
, dll), Anda dapat menggunakanRAISERROR()
dengan satu baris:RAISERROR(N'MyVariableName: %s', 0, 1, @MyVariableName)
.Ya ... Parameter pertama dari fungsi RAISERROR membutuhkan variabel NVARCHAR. Jadi coba yang berikut ini;
ATAU
sumber
Pilihan lain yang lebih baik adalah untuk tidak bergantung pada PRINT atau RAISERROR dan hanya memuat pernyataan "cetak" Anda ke tabel Temp ## di TempDB atau tabel permanen di database Anda yang akan memberi Anda visibilitas ke data segera melalui pernyataan SELECT dari jendela lain . Ini yang terbaik bagi saya. Menggunakan tabel permanen kemudian juga berfungsi sebagai log untuk apa yang terjadi di masa lalu. Pernyataan cetak berguna untuk kesalahan, tetapi menggunakan tabel log Anda juga dapat menentukan titik kegagalan yang tepat berdasarkan nilai log terakhir untuk eksekusi tertentu (dengan asumsi Anda melacak waktu mulai eksekusi keseluruhan dalam tabel log Anda.)
sumber
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
sesi pemantauan AndaREAD UNCOMMITTED
transaksi ke tabel lain, tetapi Anda mungkin melewatkan momen sebelumnyaROLLBACK
. Jadi itu mungkin memecahkan 'seberapa jauh?' bukan 'kenapa kembalikan?'Hanya untuk referensi, jika Anda bekerja dalam skrip (pemrosesan batch), tidak dalam prosedur tersimpan , output pembilasan dipicu oleh perintah GO, misalnya
Secara umum, kesimpulan saya adalah sebagai berikut: output dari eksekusi skrip mssql, mengeksekusi dalam SMS GUI atau dengan sqlcmd.exe, dihapus ke file, stdoutput, jendela gui pada pernyataan GO pertama atau sampai akhir skrip.
Pembilasan di dalam fungsi prosedur yang tersimpan berbeda, karena Anda tidak dapat menempatkan GO di dalamnya.
Referensi: Pernyataan tsql Go
sumber
go
tidak hanya menyiram output, itu mengakhiri batch sesuai tautan yang Anda berikan. Apa pun yang Andadeclare
dibuang, jadi tidak dapat digunakan untuk debugging.declare @test int print "I want to read this!" go set @test=5
meskipun Anda mengklaim kesalahan@test
tidak terdefinisi karena ada dalam batch baru.