SQL Server'da ERROR_STATE () nedir ve nasıl kullanılabilir?


13

ERROR_STATE()Kaynak kodunda aynı tür hataların meydana gelebileceği farklı durumları / konumları ayırt etmeye yardımcı olabileceğini okudum . Ancak bunun nasıl faydalı olabileceği gerçekten net değil.

MSDN şunları ifade eder:

ERROR_STATE() TRY… CATCH yapısının CATCH bloğunun çalışmasına neden olan hatanın durum numarasını döndürür.

Gerçekten nasıl kullanılabilir? Bazıları bana bir örnek verebilir mi, bu referans makalede verilenler benim için işleri açıklamaya gerçekten yardımcı olmuyor mu?


Error_Stateve Error_Numberkombinasyon size bir hata hakkında daha net resim verecektir. Burada
hatalara

Teşekkürler! Ama bu bağlantıyı daha önce de okumuştum. MSDN'de bunun için iyi örnekler verilmediğinden yardımcı olmadı. Bu yüzden burada soru sormuştum.

Yanıtlar:


9

SQL Server hata durumlarının amacı, SQL Server geliştirme ekibinin, birçok yerde birden fazla hatanın ortaya çıktığı göz önüne alındığında, tam olarak sistem hatalarının ortaya çıktığı kodu tanımlayabilmesidir.

Son kullanıcı olarak (örn. SQL Server kullanan uygulama geliştiricisi), RAISERRORürün desteğinizin bir yordamın hata yarattığı yeri tanımlayabilmesi için aktarılan durumu benzer şekilde kullanabilirsiniz, örneğin:

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

İki durumun daha sonra hangi hata durumunun vurulduğunu ayırt etmenize nasıl izin verdiğini görün. 'Ama hata mesajına bakabilirim' demeden önce size bir kelime söylüyorum: uluslararasılaşma.


Evet, aradığım şey buydu ..! :) şimdi hepsi açık! Teşekkür ederim!
jaczjill

çok güzel bir cevap. Yayınınızdan edilen bilginin daha iyi o zaman bu anlama olduğunu technet.microsoft.com/en-us/library/ms180031.aspx
kashif

6

Hayır, hatanın nerede oluştuğu hakkında bir şey bulmanıza yardımcı olmaz. İşte kısa bir örnek. 0'a bölmeye çalışırsanız, bir grup ayrıntı içeren bir hata mesajı alırsınız:

SELECT 1/0;

Sonuç:

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

Diye bir tane Bkz State1 değeriyle birlikte,? ERROR_STATE()bu değeri döndürür. Yani eğer kullanırsanız TRY/CATCH:

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

Sonuç:

----
   1

Bu kadar. Çoğu senaryoda yararlı değildir. Yararlı görünen belirli işlevlere çok derinlemesine dalmadan önce genel olarak hata işleme hakkında daha fazla okuma yapmanızı öneririm.

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

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


Teşekkürler, biraz yardımcı oldu. ayrıcalığa sahip olmadığım için cevabınızı oylayamadım. Ancak, bu fonksiyonun var olma nedenini örneği ile almak istedim. MSDN, ERROR_STATE () hata durum numarasını döndürdüğünü söylüyor, o zaman ne yapacağım !!

2
@jaczjill bazen hatanızın durumu ve hata işleme mimarinizin karmaşıklığına bağlı olarak uygulamanızın belirli bir şekilde yanıt vermesini isteyeceksiniz, ancak bunun gibi hataların yaygın olarak ele alındığından şüpheleniyorum. Hata numarasının kendisi ( belirli hataları yakalama ) veya hata şiddeti ile çok daha yaygındır . Hiç kimse var gösteren gösteren demolar dışında hata durumunu anlamlı bir şekilde kullandığını görmek hatırlamıyorum.
Aaron Bertrand

tamam, teşekkürler Aaron :) Ayrıca, bu soru için bir ödül ayarlayabilir misin? Böylece bazı teknisyenlerin EXACT cevabını almak için zorluk çekmesi gerekir. Yoksa kazanan sizsiniz.

4
Evet @AaronBertrand, doğru cevabınıza karşı rekabet etmek için kendi puanlarınızı topladı.
Zane

2
@jaczjill SQL Server hakkında Aaron'dan daha fazlasını bilen çok fazla teknik yok ve çoğu burada asla görünmüyor. Ve sorunuz burada yanıtlanıyor (büyük olasılıkla tam olarak gidebileceği kadar).
dezso

1

Kısa cevap - yapamaz. Bir ERROR_STATE aslında bir ERROR_NUMBER öğesinin bir alt bölümüdür. Hataya hangi kod satırının neden olduğunu söyleyemez (ERROR_NUMBER ve ERROR_STATE birlikte hatanın nedenini bildirdiği sürece ve bunun nedeninin ne olduğu açıktır).


Kavramsal olarak her zaman ERROR_NUMBER () işleviyle kullanılması gerektiği anlaşılmıştır. Ancak ERROR_NUMBER () ile birlikte ERROR_STATE () kullanımına bir örnek resmi tamamen netleştirecektir. VEYA herhangi bir iyi referans bağlantısı yeterli olacaktır.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.