Gönderen RAISERROR belgelerinde (vurgu benim):
0 ile 18 arasındaki önem dereceleri herhangi bir kullanıcı tarafından belirlenebilir. 19 ile 25 arasındaki önem dereceleri yalnızca sysadmin sabit sunucu rolünün üyeleri veya ALTER TRACE izinlerine sahip kullanıcılar tarafından belirlenebilir. 19 ile 25 arasındaki önem dereceleri için WITH LOG seçeneği gereklidir.
Bu ölçütleri karşılamadığı için komut dosyasını yürüttüğünüz esastır.
Kullanmanın yanlış bir yanı yok RAISERROR
; sadece aşırı önem derecesini kullanıyorsunuz. Yükseltilen bir hata için seviye 16'yı varsayılan olarak kullanıyorum ve sıra sonlandırılacak. Daha doğru olmak istiyorsanız, Microsoft'un kendisi tarafından verilen seviyeleri takip edebilirsiniz:
Şimdi, komut dosyasının içeriğine bağlı RAISERROR
olarak, komut dosyasının kendi başına "normal önem düzeylerini kullanarak" çıkmadığı için kullanmak yeterli olmayabilir.
Örneğin:
RAISERROR(N'Test', 16, 1);
SELECT 1; /* Executed! */
Bu olacak , hem bir hata yükseltmek ve bir sonuç kümesi döndürür.
Komut dosyasını hemen sonlandırmak için kullanmayı tercih ederim RETURN
( GOTO
-type yapılarını kullanmak genellikle alternatiflerin bulunduğu çoğu programlama çemberinde önerilmez):
RAISERROR(N'Test', 16, 1);
RETURN;
SELECT 1; /* Not executed */
Veya şiddeti 11 veya daha yüksekse TRY/CATCH
yürütmenin CATCH
bloğa atlamasına neden olacak hatayı kullanarak işleyin:
BEGIN TRY
RAISERROR(N'Test', 16, 1);
SELECT 1; /* Not executed */
END TRY
BEGIN CATCH
SELECT 2; /* Executed */
END CATCH
BEGIN TRY
RAISERROR(N'Test', 10, 1);
SELECT 1; /* Executed */
END TRY
BEGIN CATCH
SELECT 2; /* Not executed */
END CATCH
Ayrı bir sorun komut birden çok toplu yayılan eğer - RETURN
sadece çıkılacak toplu :
RAISERROR(N'Test', 16, 1);
RETURN;
SELECT 1; /* Not executed */
GO
SELECT 2; /* Executed! */
Bunu düzeltmek için @@ERROR
her partinin başlangıcında kontrol edebilirsiniz :
RAISERROR(N'Test', 16, 1);
RETURN;
SELECT 1; /* Not executed */
GO
IF (@@ERROR != 0)
RETURN;
SELECT 2; /* Not executed */
Edit: Martin Smith yorumlarda doğru bir şekilde işaret ettiği gibi, bu sadece 2 parti için çalışır. 3 veya daha fazla gruba genişletmek için, yükseltme hatalarını aşağıdaki gibi arttırabilirsiniz (not: GOTO
yöntem, hedef etiketin parti içinde tanımlanması gerektiği için bu sorunu çözmez):
RAISERROR(N'Test', 16, 1);
RETURN;
SELECT 1; /* Not executed */
GO
IF (@@ERROR != 0)
BEGIN
RAISERROR(N'Error already raised. See previous errors.', 16, 1);
RETURN;
END
SELECT 2; /* Not executed */
GO
IF (@@ERROR != 0)
BEGIN
RAISERROR(N'Error already raised. See previous errors.', 16, 1);
RETURN;
END
SELECT 3; /* Not executed */
Ya da belirttiği gibi , ortamınız için uygunsa SQLCMD
yöntemi kullanabilirsiniz .