2012-11-30 25 views
6

SQL Server 2005 kullanıyorum. Çoğu zaman çalışan bir saklı yordam oluşturdum, ancak istediğimi yapmadığı bir yer buldum.Depolanan yordamda sql hatası nasıl alınır

Halen kod @message_error bir çıkış değişkeni olan bu

if @@error <> 0 
    begin 
    select @message_error = "There was a database error adding product "+ @product + " to product line 
    end 

gibi bir şey yok.

Yani, select @@error yapabilir ve bir sayı olsun, ancak tek istediğim SQL hatasıdır.

Hey gibi bir şey, bunu yapamam çünkü bu sütun üzerinde veya herhangi bir fk kısıtlaması var. Ben msdn http://msdn.microsoft.com/en-us/library/ms178592(v=sql.90).aspx

Bu makale bulunamadı Ama sadece, benim kendi hata iletisi veya istisna oluşturmak istemiyoruz RAISERROR ile özel durumlar atma gider, ben sadece şeyler çalışmıyor neden bilmek istiyorum. Saklı yordamı Management Studio'yu kullanarak yürütebilir ve SQL hatasını tam olarak görebilirim, ancak bu, verileri siteden eşleştirmeye ve bu şekilde el ile ekleme yapmaya çalışırken yorucudur.

SQL hata metnini çıkış değişkenine nasıl alabilirim?

+2

ERROR_MESSAGE http://msdn.microsoft.com/en-us/library/ms190358.aspx? – Romhein

cevap

11

fonksiyonları parçası bir saklı yordam şablonu kullandığım:

/* CREATE PROCEDURE... */ 

DECLARE 
    @ErrorMessage varchar(2000) 
,@ErrorSeverity tinyint 
,@ErrorState  tinyint 

/* Additional code */ 

BEGIN TRY 

/* Your code here */ 

END TRY 

BEGIN CATCH 
    SET @ErrorMessage = ERROR_MESSAGE() 
    SET @ErrorSeverity = ERROR_SEVERITY() 
    SET @ErrorState = ERROR_STATE() 
    RAISERROR(@ErrorMessage, @ErrorSeverity, @ErrorState) 

    BREAK 
END CATCH 

/* Further cleanup code */ 

deneyin/Yakalama blokları zor ama çok daha kapsamlı @@ hata daha vardır olabilir. Daha da önemlisi, içlerinde çeşitli error_xxx() işlevlerini kullanabilirsiniz. Burada, hatayı yeniden yükseltmek için yeterli başka veri ile birlikte, uygun hata mesajını @ErrorMessage değişkeninde saklıyorum. Buradan, herhangi bir sayıda seçenek mevcuttur; @ErrorMessage'ı bir çıkış değişkeni haline getirebilir, belirli hataları test edebilir ve ele geçirebilir veya kendi hata mesajlarınızı oluşturabilir (veya mevcut olanları daha açık olacak şekilde ayarlayabilirsiniz - bunu ne sıklıkla yapmak istediğinizi bulmaktan rahatsız olabilirsiniz). Diğer seçenekler, temaları sunacaktır.

Dikkat edilmesi gereken bir şey: bazı durumlarda SQL, iki hata iletisini arka arkaya atacaktır ... ve error_message() yalnızca sonuncusunu yakalayacaktır, bu genellikle "nesne oluşturma girişiminde başarısız" gibi bir şey söyler. ilk hata iletisinde verilen gerçek hata. Bu, kendi hata iletinizin oluşturulduğu yerdir.

+0

Bu gerçekten harika bir cevap ve başlangıçta bir cevabı kabul ettiğimde gözden kaçırdığımı sanmıyorum. Teşekkürler! –

+0

Diğer bir sunucuda 'Error_Message()' diyorum ama onun olsun NULL !! Sunucu A'da bir sunucuda Sp tarafından sunucuda bir hata yakalamanız için herhangi bir yol var. Bu modelde A sunucusunda bir hata oluştuğunda, A sunucusunun Catch bloğunda A sunucusu B'den bir SP arayın, ancak bu işe yaramaz! niye ya ? – Behzad

+0

@Khosravifar, bu gerçekten kendi sorunu olarak göndermeniz gereken karmaşık bir sorundur - ve burada bir yorum olarak bir bağlantı ekleyin. –

9

Genel bir Try/Catch kullanabilir ve daha sonra CATCH bölümündeki hatayla ilgili daha fazla ayrıntı oluşturabilirsiniz.

DECLARE @DetailedErrorDesc VARCHAR(MAX) 
BEGIN TRY 

--tsql code goes here 

END TRY 
BEGIN CATCH 

SELECT @DetailedErrorDesc =   
    CAST(ERROR_NUMBER() AS VARCHAR) + ' : '+ 
    CAST(ERROR_SEVERITY() AS VARCHAR) + ' : ' + 
    CAST(ERROR_STATE() AS VARCHAR) + ' : ' + 
    ERROR_PROCEDURE() + ' : ' + 
    ERROR_MESSAGE() + ' : ' + 
    CAST(ERROR_LINE() AS VARCHAR); 

--Now you can decide what to do with the detailed error message....return it or log it etc 

END CATCH 
+0

İnanılmaz! Teşekkür ederim!! –

3

kullanım deneyin ... catch ve ERROR_MESSAGE(), ERROR_LINE(), ERROR_PROCEDURE(), ERROR_STATE(), ERROR_SEVERITY(), ERROR_NUMBER() kullanabilir catch bloğu içinde İşte

İlgili konular