throw (Transact-sql)
Bir özel durum oluşturur ve Yürütme try… catch bloğuna transfer eder.catch yapısı içinde SQL Server 2012.
Transact-SQL Sözdizim Kuralları
Sözdizimi
THROW [ { error_number | @local_variable },
{ message | @local_variable },
{ state | @local_variable }
] [ ; ]
Bağımsız değişkenler
error_number
Bir sabit veya değişken özel durumu gösterir. error_numberise intve 50000 eşit veya daha büyük olmalıdır ve küçük veya eşit 2147483647.message
Bir dizge veya değişken özel durumu açıklar. messageis nvarchar(2048).state
Bir sabit veya ileti ile ilişkilendirmek için devlet gösteren değişken 0-255 arasında olduğunu. stateis tinyint.
Açıklamalar
Noktalı virgülle (;) throw deyimini uyulması gereken önce ifade deyimi Sonlandırıcı.
Eğer bir try…catch yapısı yok, oturum sona erdi. Satır numarası ve burada özel durum oluşturuldu yordamı ayarlanır. Şiddeti 16 olarak ayarlanır.
Parametresiz throw ifadesi belirtilirse, bir catch bloğu içinde yer almalıdır. Bu özel geçirilen durum yakaladı neden olur. Deyimi toplu olmak sevdirmek için bir throw ifadesi içinde oluşan herhangi bir hata neden olur.
RAISERROR ile ATMAK arasındaki farklar
RAISERROR ve ATMAK deyimleri arasındaki farklar aşağıdaki tabloda listelenmektedir.
RAISERROR deyimi |
Deyimi ATMAK |
---|---|
Eğer bir msg_id geçirilen RAISERROR için içinde kimliği tanımlanması gereken sys.messages. |
error_numberİçinde tanımlanan parametre yok sys.messages. |
msg_strParametre içerebilir printfbiçimlendirme stilleri. |
messageParametre kabul printfStil biçimlendirmesi. |
severityParametresi, İstisnanın önem derecesi belirtir. |
There is no severityparametresi. İstisnanın önem derecesi her zaman 16 olarak ayarlanır. |
Örnekler
A.throw istisna artırmak için kullanma
Aşağıdaki örnek, nasıl kullanılacağını gösterir THROWbir istisna yükseltmek için deyimi.
THROW 51000, 'The record does not exist.', 1;
THROW 51000, 'The record does not exist.', 1;
B.throw istisna yeniden artırmak için kullanma
Aşağıdaki örnek gösterir nasıl THROWson atılmış istisna tekrar yükseltmek için deyimi.
USE tempdb;
GO
CREATE TABLE dbo.TestRethrow
( ID INT PRIMARY KEY
);
BEGIN TRY
INSERT dbo.TestRethrow(ID) VALUES(1);
-- Force error 2627, Violation of PRIMARY KEY constraint to be raised.
INSERT dbo.TestRethrow(ID) VALUES(1);
END TRY
BEGIN CATCH
PRINT 'In catch block.';
THROW;
END CATCH;
USE tempdb;
GO
CREATE TABLE dbo.TestRethrow
( ID INT PRIMARY KEY
);
BEGIN TRY
INSERT dbo.TestRethrow(ID) VALUES(1);
-- Force error 2627, Violation of PRIMARY KEY constraint to be raised.
INSERT dbo.TestRethrow(ID) VALUES(1);
END TRY
BEGIN CATCH
PRINT 'In catch block.';
THROW;
END CATCH;
Sonuç kümesi buradadır.
PRINT 'In catch block.';
Msg 2627, Level 14, State 1, Line 1
Violation of PRIMARY KEY constraint 'PK__TestReth__3214EC272E3BD7D3'. Cannot insert duplicate key in object 'dbo.TestRethrow'.
The statement has been terminated.
C.formatmessage ATMAK ile kullanma
Aşağıdaki örnek, nasıl kullanılacağını gösterir FORMATMESSAGEdeyimi ile THROWbir özelleştirilmiş hata iletisi atmaya.
DECLARE @Message NVARCHAR(2048);
SELECT @Message = FORMATMESSAGE(1127);
THROW 50001, @Message, 1;
DECLARE @Message NVARCHAR(2048);
SELECT @Message = FORMATMESSAGE(1127);
THROW 50001, @Message, 1;
Ayrıca bkz.
Başvuru
error_procedure (Transact-sql)
BAŞLAR...SONUNDA (Transact-sql)