Apa itu ERROR_STATE () dalam SQL Server dan bagaimana hal itu dapat digunakan?

13

Saya membaca yang ERROR_STATE()dapat membantu membedakan antara berbagai status / lokasi dalam kode sumber tempat jenis kesalahan yang sama dapat terjadi. Tetapi tidak terlalu jelas bagi saya bahwa itu bisa bermanfaat.

Status MSDN:

ERROR_STATE() Mengembalikan jumlah kesalahan yang menyebabkan blok CATCH dari sebuah TRY… CATCH construct dijalankan.

Bagaimana itu bisa benar-benar digunakan? Bisakah seseorang memberi saya contoh, yang disediakan dalam artikel referensi ini tidak benar-benar membantu menjelaskan hal-hal baik untuk saya?

jaczjill
sumber
Error_Statedan Error_Numberkombinasi akan memberi Anda gambaran yang lebih jelas tentang kesalahan. Lihat fungsi penanganan kesalahan terkait lainnya di sini
Ravindra Gullapalli
Terima kasih! Tetapi saya telah membaca tautan ini sebelumnya juga. Itu tidak membantu karena tidak diberikan contoh yang baik untuk ini di MSDN. Itu sebabnya saya mengajukan pertanyaan di sini.

Jawaban:

9

Tujuan status kesalahan SQL Server adalah agar tim pengembangan SQL Server dapat mengidentifikasi dalam kode tempat terjadinya kesalahan sistem, mengingat bahwa banyak kesalahan muncul di banyak tempat.

Anda sebagai pengguna akhir (mis. Pengembang aplikasi yang menggunakan SQL Server) juga dapat menggunakan status yang diteruskan ke RAISERRORsehingga dukungan produk Anda dapat mengidentifikasi tempat prosedur menimbulkan kesalahan, misalnya:

create procedure usp_my_proc
as
if <somecondition>
  raiserror(N'Error foo and bar', 16, 0);
if <someothercondition>
  raiserror(N'Error foo and bar', 16, 1);
go

Lihat bagaimana kedua negara memungkinkan Anda untuk membedakan nanti kasus kesalahan mana yang terkena. Sebelum Anda mengatakan 'tetapi saya dapat melihat pesan kesalahan' Saya memberi tahu Anda satu kata: internasionalisasi.

Remus Rusanu
sumber
Ya, inilah yang saya cari ..! :) semua beres sekarang! Terima kasih!
jaczjill
jawaban yang sangat bagus pengetahuan yang diperoleh dari posting Anda lebih baik dari pada ini technet.microsoft.com/en-us/library/ms180031.aspx
kashif
6

Tidak, itu tidak membantu Anda menemukan sesuatu tentang di mana kesalahan terjadi. Ini adalah contoh cepat. Jika Anda mencoba untuk membagi dengan 0, Anda mendapatkan pesan kesalahan dengan banyak detail:

SELECT 1/0;

Hasil:

Msg 8134, Level 16, State 1, Line 1
Divide by zero error encountered.

Lihat yang dipanggil State, dengan nilai 1? ERROR_STATE()mengembalikan nilai ini. Jadi, jika Anda menggunakan TRY/CATCH:

BEGIN TRY
  SELECT 1/0;
END TRY
BEGIN CATCH
  SELECT ERROR_STATE();
END CATCH

Hasil:

----
   1

Itu saja. Tidak berguna di sebagian besar skenario. Saya sarankan lebih banyak membaca tentang penanganan kesalahan secara umum sebelum Anda menyelami terlalu dalam ke fungsi-fungsi spesifik yang terdengar bermanfaat.

http://msdn.microsoft.com/en-us/library/ms175976.aspx

http://www.sommarskog.se/error_handling_2005.html

Aaron Bertrand
sumber
Terima kasih, ini sedikit membantu. tidak dapat memilih jawaban Anda karena saya tidak memerlukan hak istimewa. Namun, saya ingin mendapatkan alasan keberadaan fungsi ini dengan contohnya. MSDN mengatakan ERROR_STATE () mengembalikan nomor status kesalahan, lalu apa yang harus saya lakukan dengan itu !!
2
@ jaczjill kadang-kadang Anda ingin aplikasi Anda merespons dengan cara tertentu tergantung pada error_state dan kompleksitas arsitektur penanganan kesalahan Anda, tetapi saya menduga penanganan kesalahan secara luas seperti itu jarang terjadi. Jauh lebih umum dengan nomor kesalahan itu sendiri (menjebak kesalahan spesifik ) atau tingkat keparahan kesalahan. Saya tidak ingat pernah melihat orang menggunakan status kesalahan dengan cara yang berarti kecuali dalam demo yang menunjukkan bahwa itu ada.
Aaron Bertrand
baiklah, Terima kasih Aaron :) Juga, dapatkah Anda menetapkan hadiah untuk Pertanyaan ini? sehingga beberapa teknisi mengambil sebagai tantangan untuk mendapatkan jawaban yang PERSIS. Jika tidak, Anda adalah pemenangnya.
4
Ya @AaronBertrand memasang banyak poin Anda sendiri untuk bersaing dengan jawaban Anda yang benar.
Zane
2
@ jaczjill Tidak banyak teknisi yang tahu lebih banyak tentang SQL Server daripada Aaron, dan kebanyakan dari mereka tidak pernah muncul di sini. Dan pertanyaan Anda dijawab di sini (kemungkinan besar persis seperti itu bisa pergi).
dezso
1

Jawaban singkat - tidak bisa. ERROR_STATE pada dasarnya adalah sub-divisi dari ERROR_NUMBER. Itu tidak bisa memberi tahu Anda apa baris kode yang menyebabkan kesalahan (kecuali sejauh ERROR_NUMBER dan ERROR_STATE bersama-sama memberi tahu Anda penyebab kesalahan, dan kemudian menjadi jelas apa penyebabnya).

BPR.
sumber
Dipahami secara konseptual bahwa itu akan digunakan dengan fungsi ERROR_NUMBER () selalu. Namun contoh penggunaannya ERROR_STATE () dengan ERROR_NUMBER () akan memperjelas gambar sepenuhnya. ATAU tautan referensi yang bagus akan cukup.