рдПрдордПрд╕ SQL тАЛтАЛ2011 - рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ

SQL рд╕рд░реНрд╡рд░ 2011 (Denali) рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛, рдЙрдкрдпреЛрдЧреА рдРрдб-рдСрди рдереНрд░реЛ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рд╣реИред .Net рдбреЗрд╡рд▓рдкрд░реНрд╕ рдиреЗ рд╢рд╛рдпрдж рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдпрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд╣рд╛рдВ рдФрд░ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдЗрд╕ рд╢рдмреНрдж рдХрд╛ рдкреНрд░рдпреЛрдЧ Try ... рдХреИрдЪ рдХрдВрдЯреНрд░реЛрд▓ рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдХреЗ рд╕рд╛рде рдорд┐рд▓рдХрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЛ рд░рдирдЯрд╛рдЗрдо рддреНрд░реБрдЯрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реВрдЪрдирд╛ рднреЗрдЬрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЬрдм рдХреЛрдИ рдЕрдкрд╡рд╛рдж рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдкрджрд╛рдиреБрдХреНрд░рдо рдореЗрдВ рдирд┐рдХрдЯрддрдо рдХреИрдЪ рдмреНрд▓реЙрдХ рдХреЛ рдЦреЛрдЬрддрд╛ рд╣реИ рдЬреЛ рдЕрдкрд╡рд╛рдж рдХреЛ рд╕рдВрднрд╛рд▓ рд╕рдХрддрд╛ рд╣реИред рдХреИрдЪ рдмреНрд▓реЙрдХ рдХреЗ рдЕрдВрджрд░ рдЗрд╕ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рддреНрд░реБрдЯрд┐ рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдм рдЖрдк рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдХрд╣реАрдВ рднреА рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рдПрдХ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХ рд╕рдХрддреЗ рд╣реИрдВред

рдЕрдЧрд▓рд╛, рд╣рдо рдПрдХ рдЕрдкрд╡рд╛рдж рдХреЛ рдкрдХрдбрд╝рдиреЗ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЛрдВ рдХреЛ рджреЗрдЦреЗрдВрдЧреЗ, рдЬреЛ SQL Server 2000 рд╕реЗ рд╕рдВрд╕реНрдХрд░рдг 2011 рддрдХ рдкреЗрд╢реЗрд╡рд░реЛрдВ рдФрд░ рд╡рд┐рдкрдХреНрд╖реЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред



рд╡рд┐рдЪрд╛рд░рд╛рдзреАрди рд╕рднреА рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП, tbl_ExceptionTest рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред



рдорд╛рдЙрд╕ рдХреЗ рд╕рд╛рде рдбрд┐рдЬрд╛рдЗрдирд░ рдХреЛ рдЫреЗрджрдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ, рдЖрдк рд╡рд╛рдВрдЫрд┐рдд рддрд╛рд▓рд┐рдХрд╛ (рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЙрддреНрдкрдиреНрди) рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрди рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВред
IF EXISTS (SELECT * FROM sys.objects WHERE name = 'tbl_ExceptionTest' AND type = 'U') DROP TABLE tbl_ExceptionTest GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[tbl_ExceptionTest]( [Id] [int] IDENTITY(1,1) NOT NULL, [Phone Number] [int] NOT NULL, CONSTRAINT [PK_tbl_ExceptionTest] PRIMARY KEY CLUSTERED ) 

рдЕрдЧрд▓рд╛, рд╣рдо рдлрд╝реЛрди рдирдВрдмрд░ рдХреЙрд▓рдо рдореЗрдВ рдЕрдиреБрдЪрд┐рдд рдбреЗрдЯрд╛ рджрд░реНрдЬ рдХрд░рддреЗ рд╕рдордп рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдХрдИ рд░рд┐рдХреЙрд░реНрдб рдЬреЛрдбрд╝рдиреЗ рдФрд░ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдлреЗрдВрдХрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВрдЧреЗред

SQL Server 2000 (Sphinx) рдореЗрдВ рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ


рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ @@ ERROR рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛


SQL Server 2000 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рджрд┐рдиреЛрдВ рдореЗрдВ, рд╣рдо рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЪрд░ @@ рддреНрд░реБрдЯрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрд╕ рд╕рдордп рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдкреНрд░рдЧрддрд┐рд╢реАрд▓ рдФрд░ рдХреБрд╢рд▓ рддрд░реАрдХрд╛ рдерд╛ред рдпрд╣ рдЪрд░ рдкрд┐рдЫрд▓реЗ рдЕрдВрддрд┐рдо рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдореЗрдВ рдкреВрд░реНрдгрд╛рдВрдХ рддреНрд░реБрдЯрд┐ рдорд╛рди рдХреЛ рд▓реМрдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рдерд╛ред рддреНрд░реБрдЯрд┐ рдорд╛рди рдпрд╛ рддреЛ рд╕рдХрд╛рд░рд╛рддреНрдордХ рдпрд╛ рдирдХрд╛рд░рд╛рддреНрдордХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдХреЗрд╡рд▓ 0 рдиреЗ рдСрдкрд░реЗрд╢рди рдХреА рд╕рдлрд▓рддрд╛ рдХрд╛ рд╕рдВрдХреЗрдд рджрд┐рдпрд╛ред рдкреНрд░рддреНрдпреЗрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдЪрд░ рдХрд╛ рдореВрд▓реНрдп рдмрджрд▓ рдЧрдпрд╛ред

рдЖрдЗрдП @@ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдореЗрдВ рддреНрд░реБрдЯрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рджреЗрдЦреЗрдВред
 --   #tblExceptionTest  ,   . If OBJECT_ID('tempdb..#tblExceptionTest') Is not null Begin Drop Table #tblExceptionTest End --    #tblExceptionTest Create Table #tblExceptionTest (Id int identity, [Phone Number] varchar(10) not null) --  Begin Transaction TranExcp__2000_@@Error --   --       @@ERROR Declare @ErrorNum int --      Declare @i int --   Set @i =1 --   While(@i <= 4) Begin --       null   Phone Number If(@i = 4) Begin Insert into #tblExceptionTest([Phone Number]) Values(null) Set @ErrorNum = @@ERROR End Else --      Begin Insert into #tblExceptionTest([Phone Number]) Values(cast(@i as varchar(2)) + '12345678') End Set @i = @i +1 End --  while --   ,      If @ErrorNum <> 0 Begin Rollback Transaction TranExcp__2000_@@Error --      RAISERROR ('Attempt to insert null value in [Phone Number] is not allowed',16,1) End --   Else If @ErrorNum = 0 Begin Commit Transaction TranExcp__2000_@@Error End --   Select * from #tblExceptionTest 

рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рд╕рд╛рдорд╛рдиреНрдп рдЙрджреНрджреЗрд╢реНрдп рдпрд╣ рд╣реИ рдХрд┐ рдкрд┐рдЫрд▓реЗ рд░рд┐рдХреЙрд░реНрдб рдореЗрдВ рд╣рдо рдЬрд╛рдирдмреВрдЭрдХрд░ рдПрдХ рддреНрд░реБрдЯрд┐ рдкреИрджрд╛ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рд╕реНрдерд╛рдиреАрдп рдЪрд░ рд╕реЗ рдЗрд╕рдХреЗ рдореВрд▓реНрдп рдХреЛ рдкрдврд╝рддреЗ рд╣реИрдВред рдпрджрд┐ рддреНрд░реБрдЯрд┐ рдорд╛рди рд╢реВрдиреНрдп рдХреЗ рдмрд░рд╛рдмрд░ рдирд╣реАрдВ рд╣реИ, рддреЛ рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдПрдХ рд╕рд╛рд░реНрдердХ рдЪреЗрддрд╛рд╡рдиреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рдкрд░рд┐рдгрд╛рдо рд╕рд╣реЗрдЬреЗрдВред

рдЗрд╕ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдЪрд▓рд╛рдиреЗ рдореЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реЛрдЧреА, рдЬреИрд╕рд╛ рдХрд┐ рдиреАрдЪреЗ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ

Msg 515, рд╕реНрддрд░ 16, рд░рд╛рдЬреНрдп 2, рдкрдВрдХреНрддрд┐ 26 рд╕реНрддрдВрдн рдореЗрдВ рдорд╛рди рдХреЛ рд╕рдореНрдорд┐рд▓рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ 'рдлрд╝реЛрди рдирдВрдмрд░', рддрд╛рд▓рд┐рдХрд╛ 'tempdb.dboред # TblExceptionTest _____ 000000000023'; рдХреЙрд▓рдо рдирд▓ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред INSERT рд╡рд┐рдлрд▓ред рдмрдпрд╛рди рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред Msg 50000, рд▓реЗрд╡рд▓ 16, рд╕реНрдЯреЗрдЯ 1, рд▓рд╛рдЗрди 43 [рдлреЛрди рдирдВрдмрд░] рдореЗрдВ рд╢реВрдиреНрдп рдорд╛рди рдбрд╛рд▓рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИ

рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рдкреВрд░рд╛ рд▓реЗрдирджреЗрди рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧрд╛ рдФрд░ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдХреБрдЫ рднреА рджрд░реНрдЬ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

@@ рддреНрд░реБрдЯрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдиреБрдХрд╕рд╛рди



рдпрджрд┐ рдЖрдк @@ рддреНрд░реБрдЯрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╡рд░рдг рдФрд░ рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдХреЛ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдореИрдВ рдЖрдкрдХреЛ @@ рддреНрд░реБрдЯрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓реЗрдЦ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВред

рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ @@ TRANCOUNT рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛


рдпрд╣ рдЪрд░ рдЙрд╕ рдЪрд░ рдХреА рд╕рдВрдЦреНрдпрд╛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕ рд╕рдордп рдЪрд░ рдкрд╣реБрдВрдЪрддрд╛ рд╣реИред рд╡рд┐рд╡рд░рдг рд╕реЗ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдпрд╣ рд▓рдЧрднрдЧ @@ ERROR рдХреЗ рд╕рдорд╛рди рд╣реИ, рдЕрд░реНрдерд╛рддред рд▓реЗрдирджреЗрди рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди рд▓рдЧрд╛рддрд╛рд░ рдкрд░рд┐рд╡рд░реНрддрдиред рдпрд╣ рдлрд┐рд░ рд╕реЗ рд╕рдордп рдореЗрдВ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдмрд┐рдВрджреБ рдкрд░ рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИред

рдкреНрд░рддреНрдпреЗрдХ BEGIN TRANSACTION рдХреЙрд▓ 1 рд╕реЗ @@ TRANCOUNT рдмрдврд╝ рдЬрд╛рддреА рд╣реИ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ COMMIT TRANSACTION рдХреЙрд▓ 1 рд╕реЗ рдХрдо рд╣реЛ рдЬрд╛рддреА рд╣реИред ROLLBACK рдЯреНрд░рд╛рдВрд╕рдХреНрд╢рди рд╕реЗ @@ TRANCOUNT рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИред рдкреНрд░рд╡реЗрд╢ рдХреЗрд╡рд▓ рддрднреА рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдорд╛рди @@ TRANCOUNT 0 рдкрд░ рдкрд╣реБрдВрдЪрддрд╛ рд╣реИред

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ @@ TRANCOUNT рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред
 --   #tblExceptionTest ,    If OBJECT_ID('tempdb..#tblExceptionTest') Is not null Begin Drop Table #tblExceptionTest End --    Create Table #tblExceptionTest (Id int identity, [Phone Number] varchar(10) not null) --   Begin Transaction TranExcp__2000_@@TRANCOUNT --  --     @@TRANCOUNT Declare @TransactionCount int --  Declare @i int --   Set @i =1 --   While(@i <= 4) Begin --       null   Phone Number If(@i = 4) Begin Insert into #tblExceptionTest([Phone Number]) Values(null) Set @TransactionCount = @@TRANCOUNT End Else --      Begin Insert into #tblExceptionTest([Phone Number]) Values(cast(@i as varchar(2)) + '12345678') End Set @i = @i +1 End --  while --   ,        If @TransactionCount <> 0 Begin Rollback Transaction TranExcp__2000_@@TRANCOUNT --    RAISERROR ('Attempt to insert null value in [Phone Number] is not allowed',16,1) End --   Else If @TransactionCount = 0 Begin Commit Transaction TranExcp__2000_@@TRANCOUNT End --   Select * from #tblExceptionTest 

рдЗрд╕ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ, рд╣рдо рдмрдВрдж рд▓реЗрдирджреЗрди рдХреА рд╕рдВрдЦреНрдпрд╛ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВред рд▓реЗрди-рджреЗрди рдХреЛ рдирд╕реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЛ рдЕрд╕реНрддрд┐рддреНрд╡ рдХрд╛ рдЕрдзрд┐рдХрд╛рд░ рд╣реИред

@@ TRANCOUNT рдХреА рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП MSDN рд╕реЗ рд╕рдВрдкрд░реНрдХ рдХрд░реЗрдВред

рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ @@ ROWCOUNT рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛


рдпрд╣ рдЪрд░ рдХреНрд╡реЗрд░реА / рдХрдорд╛рдВрдб рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд▓реМрдЯрд╛рддрд╛ рд╣реИред

рд╡реНрдпрд╡рд╣рд╛рд░ рдкрд┐рдЫрд▓реЗ рджреЛ рдХреА рддрд░рд╣ рд╣реА рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЖрдЧреЗ рдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд▓рд┐рдП рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдореЗрдВ рдордзреНрдпрд╡рд░реНрддреА рдкрд░рд┐рдгрд╛рдо рдмрдЪрд╛рддреЗ рд╣реИрдВред

рдПрдХ рдЙрджрд╛рд╣рд░рдг:
 If OBJECT_ID('tempdb..#tblExceptionTest') Is not null Begin Drop Table #tblExceptionTest End Create Table #tblExceptionTest (Id int identity, [Phone Number] varchar(10) not null) Begin Transaction TranExcp__2000_@@ROWCOUNT Save Transaction TranExcp__SavePoint Declare @RowCount int Declare @i int Set @i =1 While(@i <= 4) Begin If(@i = 4) Begin Insert into #tblExceptionTest([Phone Number]) Values(null) Set @RowCount = @@ROWCOUNT End Else Begin Insert into #tblExceptionTest([Phone Number]) Values(cast(@i as varchar(2)) + '12345678') End Set @i = @i +1 End If @RowCount = 0 Begin Rollback Transaction TranExcp__SavePoint RAISERROR ('Attempt to insert null value in [Phone Number] is not allowed',16,1) End Else If @RowCount <> 0 Begin Commit Transaction TranExcp__2000_@@ROWCOUNT End Select * from #tblExceptionTest 

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рд░рд┐рдХреЙрд░реНрдб рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдбрд╛рд▓рд╛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдпрджрд┐ рд╕рдореНрдорд┐рд▓рд┐рдд рд░рд┐рдХреЙрд░реНрдб рдХреА рд╕рдВрдЦреНрдпрд╛ рд╢реВрдиреНрдп рд╣реИ, рддреЛ рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХреНрд░рдо рдореЗрдВ рдирд╣реАрдВ рд╣реИред
@@ ROWCOUNT рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП , MSDN рдкрдврд╝реЗрдВред

SQL Server 2005/2008 (рдпреБрдХреЛрди / рдХреИрдЯрдордИ) рдореЗрдВ рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ


SQL Server 2005 рдХреЛ рдмрд╛рдЬрд╝рд╛рд░ рдореЗрдВ рдкреЗрд╢ рдХрд░рдиреЗ рдФрд░ SQL Server 2008 рдореЗрдВ рдЕрдкрдиреЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, TSql рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рдкрд╛рд╕ рдПрдХ рдирдпрд╛ рдкреНрд░рдпрд╛рд╕ рд╣реИ ... рдкрдХрдбрд╝реЛ рдмреНрд▓реЙрдХред рдЕрдм рд▓реЗрдирджреЗрди рдХреЗ рд╕рдВрджрд░реНрдн рдХреЛ рдЦреЛрдП рдмрд┐рдирд╛ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдкрдХрдбрд╝рдирд╛ рд╕рдВрднрд╡ рд╣реИред

Try ... Catch block рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдгред
 If OBJECT_ID('tempdb..#tblExceptionTest') Is not null Begin Drop Table #tblExceptionTest End Begin TRY Create Table #tblExceptionTest (Id int identity, [Phone Number] varchar(10) not null) Begin Transaction TranExcpHandlingTest_2005_2008 Declare @i int Set @i =1 While(@i <= 4) Begin If(@i = 4) Begin Insert into #tblExceptionTest([Phone Number]) Values(null) End Else Begin Insert into #tblExceptionTest([Phone Number]) Values(cast(@i as varchar(2)) + '12345678') End Set @i = @i +1 End Commit Transaction TranExcpHandlingTest_2005_2008 End Try Begin Catch Begin Rollback Transaction TranExcpHandlingTest_2005_2008 RAISERROR ('Attempt to insert null value in [Phone Number] is not allowed',16,1) End End Catch Select * From #tblExceptionTest 

рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рд╕рдВрдХреЗрддреЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдирд┐рд╖реНрдкрд╛рджрди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣рд╛рдпрдХ рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдореЗрдВ рдПрдХ рд╕рдВрджреЗрд╢ рдорд┐рд▓рддрд╛ рд╣реИ рдЬреЛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

Msg 50,000, рд▓реЗрд╡рд▓ 16, рд╕реНрдЯреЗрдЯ 1, рд▓рд╛рдЗрди 45 [рдлреЛрди рдирдВрдмрд░] рдореЗрдВ рд╢реВрдиреНрдп рдорд╛рди рдбрд╛рд▓рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИ

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рд╢рд╛рдпрдж рдкрд╣рд▓реЗ рд╣реА рджреЗрдЦ рдЪреБрдХреЗ рд╣реИрдВ, рдЗрд╕ рдмрд╛рд░ рдХреЗрд╡рд▓ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдореЗрдВ рдЬреЛ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рд╡рд╣ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред SQL рд╕рд░реНрд╡рд░ рдиреЗ рдХреЛрдИ рдЕрддрд┐рд░рд┐рдХреНрдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рд╢рд░реНрдордирд╛рдХ рд╕рдВрджреЗрд╢ рдирд╣реАрдВ рджрд┐рдЦрд╛рдпрд╛ рд╣реИред рдПрдХреНрдЬрд╝рд┐рдХреЗрдмрд▓ рдХреЛрдб рдХреЛ рдПрдХ рдХреЛрд╢рд┐рд╢ рдмреНрд▓реЙрдХ рдореЗрдВ рдФрд░ рддреНрд░реБрдЯрд┐ рдХреЛ рдкрдХрдбрд╝рдиреЗ рд╡рд╛рд▓реЗ рдмреНрд▓реЙрдХ рдореЗрдВ рдлрдВрд╕рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкрд░рд┐рдгрд╛рдо рд╕рд╛рдл рдФрд░ рд╕реНрдкрд╖реНрдЯ рдХреЛрдб рд╣реИред рдпрджрд┐ рд╕рднреА рд╡рд╛рдВрдЫрд┐рдд рдХреЛрдб рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдмрд┐рдирд╛ рдкрд╛рд░рд┐рдд рд╣реЛ рдЧрдП, рддреЛ рдХреИрдЪ рдмреНрд▓реЙрдХ рд╕реЗ рдХреЛрдб рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ред

рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд, рдХреИрдЪ рдмреНрд▓реЙрдХ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдХрд╛рд░рдгреЛрдВ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЙрдЪрд┐рдд рд╕реНрддрд░ рдкрд░ рд╕реВрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЗ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдПрдХ рдЕрдкрд╡рд╛рдж рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп:

рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдХреИрдЪ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдмреНрд▓реЙрдХ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗ, рдЬрд┐рд╕реЗ рдкрд╣рд▓реЗ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
 Begin Catch --   Begin --   Rollback Transaction TranExcpHandlingTest_2005_2008 SELECT ERROR_NUMBER() AS ErrorNumber, ERROR_SEVERITY() AS ErrorSeverity, ERROR_STATE() AS ErrorState, ERROR_PROCEDURE() AS ErrorProcedure, ERROR_LINE() AS ErrorLine, ERROR_MESSAGE() AS ErrorMessage; End End Catch 

рдЕрдм рд╣рдореЗрдВ рд╕рд░реНрд╡рд░ рд╕реЗ рдпрд╣ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдорд┐рд▓рддреА рд╣реИ:



RaiseError рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдиреБрдХрд╕рд╛рди


1 рдЕрдЧрд░ рд╣рдореЗрдВ рдпрд╛рдж рд╣реИ рдХрд┐ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдиреЗ рдХреИрдЪ рдмреНрд▓реЙрдХ рдореЗрдВ рдХреНрдпрд╛ рджрд┐рдЦрд╛рдпрд╛ рдерд╛, рддреЛ рд╣рдордиреЗ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдХрд┐ рдпрд╣ рд▓рд╛рдЗрди рдирдВрдмрд░ 45 рдХреЛ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рд╕реНрд░реЛрдд рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИред



рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд▓рд╛рдЗрди рдирдВрдмрд░ 24 рдкрд░ рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реБрдИ, рдЗрд╕рд▓рд┐рдП рдЬрд╣рд╛рдВ рдпрд╣ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛

#TblExceptionTest ([рдлрд╝реЛрди рдирдВрдмрд░]) рдорд╛рди (рд╢реВрдиреНрдп) рдбрд╛рд▓реЗрдВ

рдЬрдмрдХрд┐ ERROR_LINE () рдлрд╝рдВрдХреНрд╢рди рд╣рдореЗрд╢рд╛ рд╡рд╣ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕реНрдерд╛рди рджреЗрддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рддреНрд░реБрдЯрд┐ рд╣реБрдИ рдереАред рдирдП рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдХрд╛рдо рдХреЛ рджрд┐рдЦрд╛рдиреЗ рдХрд╛ рдПрдХ рдФрд░ рддрд░реАрдХрд╛ рдпрд╣ рд╣реЛрдЧрд╛:
 Begin Catch Begin Rollback Transaction TranExcpHandlingTest_2005_2008 DECLARE @errNumber INT = ERROR_NUMBER() DECLARE @errMessage VARCHAR(500) = 'Attempt to insert null value in [Phone Number] is not allowed' RAISERROR('Error Number: %d, Message: %s', 16, 1, @errNumber, @errMessage) End End Catch 



рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, SQL рд╕рд░реНрд╡рд░ рдЗрдВрдЬрди рдЗрд╕ рд╕рдВрджреЗрд╢ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдЧрд╛:



рдЬрд┐рд╕рд╕реЗ рд╣рдо рдпрд╣ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ RaiseError рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕реНрдерд╛рди рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рдмрдирд╛рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдЕрдкрд╡рд╛рдж рд╣реБрдЖред

2 RaiseError рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЕрдЧрд▓рд╛ рджреЛрд╖ рдпрд╣ рд╣реИ рдХрд┐ рдХреЙрд▓ рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЛ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рдЕрдкрд╡рд╛рдж рдХреЛ рдлрд┐рд░ рд╕реЗ рдЙрдард╛рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рд╣рдо рдиреАрдЪреЗ рджрд┐рдЦрд╛рдП рдЧрдП рдЕрдиреБрд╕рд╛рд░ рдХреИрдЪ рдмреНрд▓реЙрдХ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрддреЗ рд╣реИрдВ
 Begin Catch Begin Rollback Transaction TranExcpHandlingTest_2005_2008 RAISERROR(515, 16, 1) End End Catch 

рдпрд╣ рдкреНрд░рд╛рдкреНрдд рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдЗрд╕ рддрд░рд╣ рд╣реЛрдЧрд╛:

Msg 2732, рд╕реНрддрд░ 16, рд░рд╛рдЬреНрдп 1, рдкрдВрдХреНрддрд┐ 46 рддреНрд░реБрдЯрд┐ рд╕рдВрдЦреНрдпрд╛ 515 рдЕрдорд╛рдиреНрдп рд╣реИред рд╕рдВрдЦреНрдпрд╛ 2147483647 рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ 13000 рд╕реЗ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рдФрд░ рдпрд╣ 50,000 рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреА рд╣реИ

рдЗрд╕рдХрд╛ рдПрдХ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдирдИ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рддреНрд░реБрдЯрд┐ рд╕рдВрдЦреНрдпрд╛ sys рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП ред рд╕рдВрджреЗрд╢ ред

RaiseError рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рдЕрдзреНрдпрдпрди рдХреЗ рд▓рд┐рдП, рдЗрд╕реЗ рдкрдврд╝рдиреЗ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рдЬрд╛рддреА рд╣реИ:


SQL рд╕рд░реНрд╡рд░ 2011 (Denali) рдореЗрдВ рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ


RaiseError рдлрд╝рдВрдХреНрд╢рди рдХреА рдЙрдкрд░реНрдпреБрдХреНрдд рдХрдорд┐рдпрд╛рдВ рдирдП рдереНрд░реЛ рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкрд╛рд░ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИрдВред

RaiseError рдлрд╝рдВрдХреНрд╢рди рдХреА рдкрд╣рд▓реА рдЦрд╛рдореА, рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдкрд╣рд▓реЗ рдмрддрд╛рдпрд╛ рдерд╛, рддреНрд░реБрдЯрд┐ рдХреА рд╕рдЯреАрдХ рд░реЗрдЦрд╛ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрдерддрд╛ рд╣реИред рдЗрд╕ рдмрд╛рдд рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдХрд┐ рддреНрд░реБрдЯрд┐ рдХрд╣рд╛рдБ рд╕реЗ рд╣реБрдИ рд╣реИ рд╣рдо рдереНрд░реЛ рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рд╣рдо рдереНрд░реЛ рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреИрдЪ рдмреНрд▓реЙрдХ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрддреЗ рд╣реИрдВред
 Begin Catch Begin Rollback Transaction TranExcpHandlingTest_2011; THROW End End Catch 

рдЖрдЙрдЯрдкреБрдЯ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реЛрдЧрд╛:



рдпрд╣ рд╡рд╣реА рд╣реИ рдЬрд╣рд╛рдБ рддреНрд░реБрдЯрд┐ рд╣реБрдИред рдЦреИрд░, рдпрд╣ рдЕрдм рддрдХ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рджреВрд╕рд░рд╛ рджреЛрд╖ рдпрд╣ рдерд╛ рдХрд┐ RaiseError рдлрд╝рдВрдХреНрд╢рди рдПрдХ рдЕрдкрд╡рд╛рдж рдХреЛ рдлрд┐рд░ рд╕реЗ рдирд╣реАрдВ рдмрдврд╝рд╛ рд╕рдХрддрд╛ рдХреНрдпреЛрдВрдХрд┐ RAISE ERROR рдПрдХ рддреНрд░реБрдЯрд┐ рд╕рдВрдЦреНрдпрд╛ рдХреА рдЙрдореНрдореАрдж рдХрд░рддрд╛ рд╣реИ, рдЬреЛ sys.messages рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИред рдереНрд░реЛ рдХрдорд╛рдВрдб рдпрд╣ рдЙрдореНрдореАрдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рддреНрд░реБрдЯрд┐ рд╕рдВрдЦреНрдпрд╛ sys.messages рд╕рд┐рд╕реНрдЯрдо рдЯреЗрдмрд▓ рдХреА рд╕реАрдорд╛ рд╕реЗ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рд╕рдВрдЦреНрдпрд╛ 50,000 рд╕реЗ 2147483647 рд╕рдорд╛рд╡реЗрд╢реА рд╕реАрдорд╛ рддрдХ рд╕реЗрдЯ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред

рдлрд┐рд░, рд╣рдо рдирдП рдЬреНрдЮрд╛рди рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХреИрдЪ рдмреНрд▓реЙрдХ рдХреЛ рдмрджрд▓ рджреЗрдВрдЧреЗред
 Begin Catch Begin Rollback Transaction TranExcpHandlingTest_2011; THROW 50001,'Attempt to insert null value in [Phone Number] is not allowed',1 End End Catch 

рдЕрдкрд╡рд╛рдж рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реЛрдЧрд╛

Msg 50001, рд▓реЗрд╡рд▓ 16, рд╕реНрдЯреЗрдЯ 1, рд▓рд╛рдЗрди 45 [рдлреЛрди рдирдВрдмрд░] рдореЗрдВ рд╢реВрдиреНрдп рдорд╛рди рдбрд╛рд▓рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИ

рд╡рд░реНрддрдорд╛рди рдореЗрдВ, SQL рд╕рд░реНрд╡рд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдкрдХрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рддрд░реАрдХреЗ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрднреА рддрдХ рд╕рднреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЖрдЬрд╝рдорд╛рдХрд░ рдирд╣реАрдВ рдкрдХрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ ... рдмреНрд▓реЙрдХ рдкрдХрдбрд╝реЛ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

рдпрджрд┐ рдЖрдк рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ:
 Begin Try --   tblInvalid Insert Into tblInvalid(Id,DOB) Values(1,DATEADD(year,1,'2011-02-26')) End Try Begin Catch --  THROW End Catch 

рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдпреЛрдЬрдирд╛ рдХрд╛ рдПрдХ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧрд╛:

Msg 208, рд╕реНрддрд░ 16, рд░рд╛рдЬреНрдп 0, рдкрдВрдХреНрддрд┐ 3 рдЕрдорд╛рдиреНрдп рдСрдмреНрдЬреЗрдХреНрдЯ рдирд╛рдо 'tblInvalid'ред

рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд░реЛрдХрдирд╛ рд▓рдЧрднрдЧ рдЕрд╕рдВрднрд╡ рд╣реИред

рд▓реЗрдХрд┐рдиред рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рдереЛрдбрд╝реА рд╕реА рдЪрд╛рд▓ рд╣реИ рдХрд┐ рдЖрдк рдХреНрдпрд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдПрд╣рд╕рд╛рд╕ рдХреИрд╕реЗ рдХрд░реЗрдВред рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░ рджреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд╛рд░реНрдпрд╡рд┐рдзрд┐рдпрд╛рдБ рдмрдирд╛рдирд╛ рд╣реИ рдФрд░ рджреВрд╕рд░реЗ рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ ... рдмреНрд▓реЙрдХ рдХреЛ рдкрдХрдбрд╝реЗрдВ рдФрд░ рдЕрдкрд╡рд╛рдж рдХреЛ рдкрдХрдбрд╝реЗрдВред рдЕрдкрдиреА рдзрд╛рд░рдгрд╛ рдХреЛ рд╕рд╛рдмрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрди рд▓рд┐рдкрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
 --   ,  ,   If Exists (Select * from sys.objects where name = 'usp_InternalStoredProc' and type = 'P') Drop Procedure usp_InternalStoredProc Go --     Create Procedure usp_InternalStoredProc As Begin Begin Transaction TranExcpHandlingTest_2011 Begin Try --     Insert Into tblInvalid(Id,DOB) Values(1,DATEADD(year,1,'2011-02-26')) --   Commit Transaction TranExcpHandlingTest_2011 End Try Begin Catch If @@TRANCOUNT > 0 Rollback Transaction TranExcpHandlingTest_2011 Print 'In catch block of internal stored procedure.... throwing the exception'; --   THROW End Catch End Go --       --   ,  ,   If Exists (Select * from sys.objects where name = 'usp_ExternalStoredProc' and type = 'P') Drop Procedure usp_ExternalStoredProc Go --     Create Procedure usp_ExternalStoredProc As Begin Begin Try --    Exec usp_InternalStoredProc End Try Begin Catch Print 'In catch block of external stored procedure.... throwing the exception'; SELECT ERROR_NUMBER() AS ErrorNumber ,ERROR_SEVERITY() AS ErrorSeverity ,ERROR_STATE() AS ErrorState ,ERROR_PROCEDURE() AS ErrorProcedure ,ERROR_LINE() AS ErrorLine ,ERROR_MESSAGE() AS ErrorMessage; THROW End Catch End Go --    Exec usp_ExternalStoredProc 

рдЬрдм ExternalStoredProc рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рд╕рдВрджреЗрд╢ рдорд┐рд▓рддрд╛ рд╣реИ:
 In catch block of external stored procedure.... throwing the exception (1 row(s) affected) Msg 208, Level 16, State 1, Procedure usp_InternalStoredProc, Line 8 Invalid object name 'tblInvalid'. 

рдФрд░ рдкрд░рд┐рдгрд╛рдо рдкреИрдирд▓ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдбреЗрдЯрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдЧрд╛:



рд╣рдореЗрдВ рдХреНрдпрд╛ рдЪрд╛рд╣рд┐рдП!

рдЕрдм рдереЛрдбрд╝рд╛ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреИрд╕реЗ рдХреЛрдб рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ 2 рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд╛рд░реНрдпрд╡рд┐рдзрд┐рдпрд╛рдБ рд╣реИрдВ: usp_InternalStoredProc рдФрд░ usp_ExternalStoredProc ред Usp_InternalStoredProc рдореЗрдВ рд╣рдо рдмрд┐рдирд╛ рдХрд┐рд╕реА рддрд╛рд▓рд┐рдХрд╛ рдХреЗ #tblInnerTempTable рдореЗрдВ рдПрдХ рд░рд┐рдХреЙрд░реНрдб рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд╣рдореЗрдВ рдПрдХ рдЕрдкрд╡рд╛рдж рдорд┐рд▓рддрд╛ рд╣реИ, рдЬреЛ рдмрд╛рд╣рд░реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд╕реНрдерд┐рдд рдмрд╛рд╣рд░реА рдХреИрдЪ рдмреНрд▓реЙрдХ рджреНрд╡рд╛рд░рд╛ рдкрдХрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд▓рд╛рдЗрди рдФрд░ рддреНрд░реБрдЯрд┐ рдХрд╛ рдкрд╛рда рд╣рдорд╛рд░реА рдЕрдкреЗрдХреНрд╖рд╛рдУрдВ рдХрд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкрд╛рд▓рди рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕рдЯреАрдХ рд╕реНрдерд╛рди рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрддрд╛ рд╣реИред

рдПрдХ рдЕрд░реНрдзрд╡рд┐рд░рд╛рдо рдХреЗ рд╕рд╛рде рдмрд╛рд╣рд░реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдЖрдЧрд╛рдореА THROW рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдмрдВрдж рдирд╣реАрдВ рдХрд░рдирд╛ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред THROW рдХрдорд╛рдВрдб рдХрд╛ рдПрдХ рдирдпрд╛ рд╕реЗрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЕрдиреНрдпрдерд╛, рдПрдХ рддреНрд░реБрдЯрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ

RO THROW тАЩрдХреЗ рдкрд╛рд╕ рдЧрд▓рдд рд╕рд┐рдВрдЯреИрдХреНрд╕ред

THROW рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рдЬрд╛рдирдХрд╛рд░реА MSDN рд╕реЗ рдкрд╛рдИ рдЬрд╛ рд╕рдХрддреА рд╣реИред

рдЪрдХреНрд░ рд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рдг:
MS SQL рд╕рд░реНрд╡рд░ 2011: рд╕реНрдЯреИрдВрдб-рдЕрд▓реЛрди рдбреЗрдЯрд╛рдмреЗрд╕ , рдирдпрд╛ рдЕрдиреБрдХреНрд░рдо рдСрдмреНрдЬреЗрдХреНрдЯ , рдСрдлрд╕реЗрдЯ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ , рдПрд░рд░ рд╣реИрдВрдбрд▓рд┐рдВрдЧ , рд░рд┐рдЬрд▓реНрдЯ рд╕реЗрдЯ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд╕рд╛рде , SSMS рдореЗрдВ рдирдпрд╛ ред

Source: https://habr.com/ru/post/In123507/


All Articles