RAISERROR (Transact-SQL)
Bir hata iletisi oluşturur ve hata işleme'oturumu oturumbaşlatır.RAISERROR ya da kullanıcı tanımlı ileti depolanan başvuru sys.messages Katalog görünümü veya ileti dinamik olarak oluşturabilir.İleti sunucu hata iletisi döndürülür, çağıran uygulama veya bir ilişkili catch blok bir try…catch yapı.
Sözdizimi
RAISERROR ( { msg_id | msg_str | @local_variable }
{ ,severity ,state }
[ ,argument [ ,...n ] ] )
[ WITH option [ ,...n ] ]
Bağımsız değişkenler
msg_id
Depolanan kullanıcı tanımlı hata ileti numarası sys.messages Katalog görünümü kullanarak e sp_addmessage.Kullanıcı tanımlı hata iletileri için hata numaraları, 50000'den büyük olmalıdır.Zaman msg_id belirtilmezse, RAISERROR 50000'den numaralı hata ile bir hata iletisi oluşturuyor.msg_str
Biçimlendirmeye sahip bir kullanıcı tanımlı ileti benzer printf işlev Standart c Kitaplığı'nda.Hata iletisi, maksimum 2,047 karakter olabilir.İleti 2.048 ya da daha fazla karakter içeriyorsa, yalnızca ilk 2,044 görüntülenir ve ileti kesildi belirtmek için üç nokta eklenir.Not değiştirme parametreleri çıktı dahili depolama davranış nedeniyle gösterir daha daha fazla karakter tüketirler.Örneğin, değiştirme parametresi %d atanan değeri 2 olan gerçekten üreten bir karakter dize iletisi ancak üç ek karakter de kendi içinde kapladığıdepolama.Bu depolama gereksinimi ileti çıktı için kullanılabilen karakter sayısını azaltır.Zaman msg_str belirtilen RAISERROR 50000'den numaralı hata ile bir hata iletisi oluşturuyor.
msg_strİsteğe bağlı gömülü Dönüştürme belirtimlerinin ile karakter dize olan.Her dönüşüm belirtimi nasıl bağımsız değişken listesindeki bir değeri biçimlendirilmiş ve alan dönüştürme belirtimi konumda yerleştirilen tanımlar msg_str.Dönüştürme belirtimlerinin bu biçime sahiptir:
% [[flag] [width] [. precision] [{h | l}]type
Kullanılabilir parametreleri msg_str olan:
flag
Aralık ve bloklama değiştirilen değeri belirleyen bir koddur.
Kod
Önek veya bloklama
Açıklama
-(eksi)
Sola yaslı
Bağımsız değişken değeri içinde verilen alan genişliği Sola Hizala.
+ (artı)
İşareti öneki
Yazın bağımsız değişken değeri artı (+) veya eksi (-) değer imzalı bir tür ise.
0 (sıfır)
Sıfır doldurma
En küçük genişliğe ulaşıncaya kadar çıktı sıfırlarla yazın.0, 0 İle eksi işareti (-) göründüğünde yoksayılır.
# (sayı)
0 x veya x x onaltılık türü için önek
O, x, x veya biçimi kullanıldığında, numara işareti (#flag) sıfırdan farklı bir değer 0, 0 x veya 0 prefaces x, sırasıyla.G, i veya u başında numara karakteriyle (#flag), bayrak yoksayıldı.
' ' (boş)
Boşluk doldurma
İmzalanmış ve pozitif bir değer ise, boşluk ile çıkış değeri yazın.Artı işareti (+) bayrağı ile eklenince dikkate alınmaz.
width
Bağımsız değişken değeri yerleştirileceği alan en küçük genişliğe tanımlayan bir tamsayıdır.Bağımsız değişken değerinin uzunluğunu eşit veya daha uzun olup width, hiçbir doldurmaile değeri yazdırılır.Daha kısa bir değer ise widthiçin belirtilen uzunluk değeri azsa, width.
Genişliği bir tamsayı değeri olmalıdır bağımsız değişken listesinde ilişkili bağımsız değişkeni tarafından belirtilen bir yıldız işareti (*) anlamına gelir.
precision
En fazla bağımsız değişken değeri dize değerleri için alınan karakter sayısıdır.Örneğin, beş karakter dize vardır ve precision 3 ise, yalnızca ilk üç karakter dize değeri kullanılır.
Tamsayı değerleri için precision minimum yazdırılan basamak sayısıdır.
Precision bir tamsayı değeri olmalıdır bağımsız değişken listesinde ilişkili bağımsız değişkeni tarafından belirtilen bir yıldız işareti (*) anlamına gelir.
{y | m}type
Karakter türleri d ile kullanılan i, o, s, x, x veya u, oluşturur ve shortint (h) veya longint (l) değerleri.
Tür belirtimi
Temsil eder
d veya ı
İşaretli tamsayı
o
Sekizlik imzalanmamış
s
String
u
İşaretsiz tamsayı
x veya x
İmzalanmamış onaltılı
Not
Bu tür belirtimleri için ilk olarak tanımlanan ayarlara bağlı olarak printf işlev Standart c Kitaplığı'nda.RAISERROR ileti dizeleri haritası için kullanılan tür belirtimleri Transact-SQL sırada belirtimleri kullanılan veri türleri printf map c dilinin veri türleri.Kullanılan belirtimleri yazın printf RAISERROR tarafından desteklenmeyen, Transact-SQL yok veri türü benzer ilişkili c veri türü.Örneğin, %p İşaretçiler belirtimi desteklenmiyor RAISERROR, çünkü Transact-SQL yok bir işaretçi veri türü.
Not
Bir değere dönüştürmek için Transact-SQL bigint veri türünü belirtmek % I64d.
**@local_variable
Aynı şekilde biçimlendirilmiş bir dize içeren herhangi bir geçerli karakter veri türü bir değişken msg_str.@**local_variable olması char veya varchar, veya bu veri türlerini. için örtülü olarak dönüştürülmesi mümkünseverity
Bu iletiyle ilişkili kullanıcı tanımlı önem düzey bulunur.Kullanırken msg_id kullanarak oluşturulan kullanıcı tanımlı ileti yükseltmek için e sp_addmessage, belirtilen önem RAISERROR üzerinde belirtilen önem geçersiz kılar e sp_addmessage.Önem düzeyleri 0'dan 18'e kadar herhangi bir kullanıcı tarafından belirlenebilir.19-25 Arasındaki önem düzeyleri yalnızca üyeleri tarafından belirtilmesi sysadmin sabit sunucu rolü ya da alter trace izni olan kullanıcılar.19-25 Arasındaki önem düzeyleri için ile günlük seçeneği gereklidir.
Dikkat 20 İle 25 arasındaki önem düzeyleri önemli olarak kabul edilir.Önemli önem düzey ile karşılaşılırsa, iletiyi aldıktan sonra istemci bağlantı sonlandırılır ve hata ve uygulama günlüklerinde hata günlüğe kaydedilir.
Not
0 0 Yorumlanır çok daha az önem düzeyleri.25'den büyük önem düzeyleri 25 yorumlanır.
state
0 İle 255 arasında bir tamsayıdır.Negatif değerler veya 255 hata üretmek daha büyük değerler.Aynı kullanıcı tanımlı hata birçok konumda oluşturulur, her konum için benzersiz durum numarasını kullanarak kodun hangi bölümünü hataları yükseltme bulmak yardımcı olabilir.
argument
Alternatifi tanımlanan değişkenleri için kullanılan parametreleri olan msg_str veya ileti karşılık gelen msg_id.0 Ya da daha fazla değişim parametresi olabilir ancak ikame parametresi toplam sayısı 20 geçemez.Her alternatifi parametresi, yerel bir değişken veya bu veri türlerinden biri olabilir: tinyint, smallint, int, char, varchar, nchar, nvarchar, binary, or varbinary.Diğer veri türleri desteklenir.option
Hata için özel bir seçenek ve tabloaşağıdaki değerlerden biri olabilir.Değer
Açıklama
GÜNLÜK
hata günlüğü ve örnek için uygulama günlüğüne hata günlükleri Microsoft SQL Server Veritabanı Altyapısı.hata günlüğü en fazla 440 bayt için şu anda sınırlı hatalardır.Yalnızca üye sysadmin sabit sunucu rolü ya da alter trace izni olan bir kullanıcının oturum ile belirtebilirsiniz.
NOWAIT
İletileri hemen istemcigönderir.
SETERROR
@@ error ve error_number değerlere ayarlar msg_id veya 50000, önem düzeyne olursa olsun'den.
Açıklamalar
RAISERROR tarafından oluşturulan hatalar tarafından oluşturulan hatalar ile aynı çalışmaya Veritabanı Altyapısı kod.RAISERROR tarafından belirtilen değerleri ERROR_LINE, error_message, error_number, error_procedure, ERROR_SEVERITY, error_state ve @@ error sistem işlevleritarafından bildirilir.RAISERROR önem 11 veya daha yüksek bir try blokile çalıştırıldığında, denetim ilişkili catch blokaktarır.RAISERROR çalıştırmak, hata çaðýrana döndürülür:
kapsam herhangi dışında blokdeneyin.
Bir önem 10 veya daha düşük bir try blokile.
20 Veya daha yüksek önem derecesi ile veritabanı bağlantısını sonlandırır.
catch bloğu RAISERROR catch blok error_number ve error_message gibi sistem işlevleri kullanarak özgün hata bilgilerini almak için çağrılan hata yeniden oluşturma için kullanabilirsiniz.kümeDaha fazla bilgi için, bkz. İşlemek için try...Transact-SQL'de catch.
Zaman msg_id bulunan bir kullanıcı tanımlı ileti belirtir sys.messages Katalog görünümü RAISERROR kullanarak belirtilen bir kullanıcı tanımlı ileti metne uygulanan olarak aynı kuralları kullanarak metin sütun iletiden işler msg_str.Dönüştürme belirtimlerinin kullanıcı tanımlı ileti metni içerebilir ve RAISERROR bağımsız değişken değerleri dönüştürme belirtimlere eşler.Use e sp_addmessage kullanıcı tanımlı hata iletileri eklemek ve sp_dropmessage kullanıcı tanımlı hata iletileri silmek için.
RAISERROR yazdırma alternatif olarak uygulamaları çağırmak için iletiler döndürmek için kullanılır.RAISERROR destekler işlevleri için benzer karakter değişimine printf işlev c standart Kitaplığı'nda iken Transact-SQL PRINT deyim vermiyor değil.11 19 Bir try blok için önemi ile RAISERROR çalışacak denetim ilişkili catch blokaktarır ancak yazdırma deyim try bloğu tarafından etkilenmez.RAISERROR catch blokyürütmesini olmadan bir try blok bir ileti dönmek için kullanılacak bir önem 10 veya daha düşük belirtin.
Genellikle, birbirini izleyen bağımsız değişkenlerin birbirini izleyen dönüştürme ayrıntılarını değiştirme; İlk bağımsız değişken ilk dönüştürme belirtimini değiştirir, ikinci bağımsız değişken ikinci dönüştürme belirtimi ve benzeri yerini alır.Aşağıdaki örnek, RAISERROR deyim, ilk bağımsız N'number' ilk dönüştürme belirtimini değiştirir %s; ve ikinci baðýmsýz 5 ikinci dönüştürme belirtimini değiştirir %d.
RAISERROR (N'This is message %s %d.', -- Message text.
10, -- Severity,
1, -- State,
N'number', -- First argument.
5); -- Second argument.
-- The message text returned is: This is message number 5.
GO
Yıldız işareti (*) genişliği veya precision dönüştürme belirtimi için belirtilmişse, genişliği veya duyarlılık için kullanılacak değer bir tamsayı değişken değeri belirtilir.Bu durumda, her biri için genişlik, hassasiyet ve değiştirme değeri en fazla üç bağımsız bir dönüştürme belirtimi kullanabilirsiniz.
Aşağıdaki örnek, hem de RAISERROR deyimleri aynı dizedönmek.Bir bağımsız değişken listesinde genişlik ve kesinlik değerleri belirtir; diğer onları dönüştürme belirtimini belirtir.
RAISERROR (N'<<%*.*s>>', -- Message text.
10, -- Severity,
1, -- State,
7, -- First argument used for width.
3, -- Second argument used for precision.
N'abcde'); -- Third argument supplies the string.
-- The message text returned is: << abc>>.
GO
RAISERROR (N'<<%7.3s>>', -- Message text.
10, -- Severity,
1, -- State,
N'abcde'); -- First argument supplies the string.
-- The message text returned is: << abc>>.
GO
Örnekler
A.Hata bilgisi bir catch blokdöndürülüyor
Aşağıdaki kod örneği nasıl kullanılacağını gösterir RAISERROR içinde bir TRY blok sıçramak için ilişkili yürütme neden CATCH blok.Ayrıca nasıl kullanılacağını gösteren RAISERROR çağrılan hata hakkında bilgi dönmek için CATCH blok.
Not
RAISERROR hata durumu ile 1 ile 127 arasında yalnızca oluşturur.Çünkü Veritabanı Altyapısı hatalara neden olabilir durumu 0, onu bir değer olarak RAISERROR durum parametresi geçirmeden önce error_state tarafından döndürülen hata durumunu denetlemenizi öneririz
BEGIN TRY
-- RAISERROR with severity 11-19 will cause execution to
-- jump to the CATCH block.
RAISERROR ('Error raised in TRY block.', -- Message text.
16, -- Severity.
1 -- State.
);
END TRY
BEGIN CATCH
DECLARE @ErrorMessage NVARCHAR(4000);
DECLARE @ErrorSeverity INT;
DECLARE @ErrorState INT;
SELECT
@ErrorMessage = ERROR_MESSAGE(),
@ErrorSeverity = ERROR_SEVERITY(),
@ErrorState = ERROR_STATE();
-- Use RAISERROR inside the CATCH block to return error
-- information about the original error that caused
-- execution to jump to the CATCH block.
RAISERROR (@ErrorMessage, -- Message text.
@ErrorSeverity, -- Severity.
@ErrorState -- State.
);
END CATCH;
B.Sys.messages içinde bir anlık ileti oluşturma
Depolanan ileti nasıl aşağıdaki örnekte gösterilmektedir sys.messages Katalog görünümü.İletiye eklenmiş olan sys.messages Katalog görünümü kullanarak sp_addmessage ileti numarasıolarak sistem saklı yordam 50005.
sp_addmessage @msgnum = 50005,
@severity = 10,
@msgtext = N'<<%7.3s>>';
GO
RAISERROR (50005, -- Message id.
10, -- Severity,
1, -- State,
N'abcde'); -- First argument supplies the string.
-- The message text returned is: << abc>>.
GO
sp_dropmessage @msgnum = 50005;
GO
C.İleti metni sağlamak için yerel bir değişken kullanarak
Aşağıdaki kod örneği, yerel bir değişken ileti metni sağlamak için nasıl kullanılacağını gösterir bir RAISERROR deyim.
DECLARE @StringVariable NVARCHAR(50);
SET @StringVariable = N'<<%7.3s>>';
RAISERROR (@StringVariable, -- Message text.
10, -- Severity,
1, -- State,
N'abcde'); -- First argument supplies the string.
-- The message text returned is: << abc>>.
GO
Ayrıca bkz.