Cần phải chỉ ra rằng, ngay cả khi về mặt kỹ thuật có thể xen kẽ giữa THROW
và RAISERROR
, rất có thể bạn sẽ không muốn thực sự làm điều này. Tại sao? Bởi vì khả năng rất tiện lợi của việc không tham số THROW
để ném lại lỗi bằng cách sử dụng cùng một Số Thông báo (nghĩa là Msg 8134
thay vì trong Msg X
đó X
> = 50000) không phải là điểm khác biệt duy nhất giữa chúng: THROW
là hủy bỏ hàng loạt trong khiRAISERROR
không phải là . Đây có thể là một sự khác biệt quan trọng về hành vi như được trình bày dưới đây.
Kiểm tra cài đặt
--DROP PROC ##Throw;
--DROP PROC ##RaisError;
GO
CREATE PROCEDURE ##Throw
AS
SET NOCOUNT ON;
BEGIN TRY
SELECT 1/0 AS [DivideByZero];
END TRY
BEGIN CATCH
THROW;
END CATCH;
SELECT 1 AS [AA];
GO
CREATE PROCEDURE ##RaisError
AS
SET NOCOUNT ON;
BEGIN TRY
SELECT 1/0 AS [DivideByZero];
END TRY
BEGIN CATCH
RAISERROR('test, yo!', 16, 1);
-- RETURN; -- typically at end of CATCH block when using RAISERROR
END CATCH;
SELECT 2 AS [BB];
GO
Kiểm tra 1
EXEC ##Throw;
SELECT 3 AS [CC];
Trả về:
"Results" Tab:
DivideByZero
{empty result set}
"Messages" Tab:
Msg 8134, Level 16, State 1, Procedure ##Throw, Line 38
Divide by zero error encountered.
Kiểm tra 2
EXEC ##RaisError;
SELECT 4 AS [DD];
Trả về:
"Results" Tab:
DivideByZero
{empty result set}
BB
2
DD
4
"Messages" Tab:
Msg 50000, Level 16, State 1, Procedure ##RaisError, Line 45
test, yo!
Để công bằng, có thể che giấu sự khác biệt này bằng cách làm như sau:
- Luôn luôn bọc tất cả các cuộc gọi đến mã bằng cách sử dụng
THROW
trong mộtTRY...CATCH
cấu trúc (được trình bày bên dưới)
- Không bao giờ đặt mã sau
THROW
(tốt, ngoại trừ END CATCH;
)
Bài kiểm tra 3
BEGIN TRY
EXEC ##Throw;
SELECT 5 AS [EE];
END TRY
BEGIN CATCH
SELECT ERROR_NUMBER() AS [ErrorNumber], ERROR_MESSAGE() AS [ErrorMessage];
END CATCH;
SELECT 6 AS [FF];
GO
Trả về:
"Results" Tab:
DivideByZero
{empty result set}
ErrorNumber ErrorMessage
8134 Divide by zero error encountered.
FF
6
Kiểm tra 4
BEGIN TRY
EXEC ##RaisError;
SELECT 7 AS [GG];
END TRY
BEGIN CATCH
SELECT ERROR_NUMBER() AS [ErrorNumber], ERROR_MESSAGE() AS [ErrorMessage];
END CATCH;
SELECT 8 AS [HH];
GO
Trả về:
"Results" Tab:
DivideByZero
{empty result set}
ErrorNumber ErrorMessage
50000 test, yo!
HH
8