Tôi đang trải qua một số hành vi THROW
mà tôi không thể hiểu. Hãy xem xét các thủ tục được lưu trữ sau đây:
CREATE PROCEDURE usp_division_err AS
SET NOCOUNT ON;
BEGIN TRY
EXEC('select 1/0')
END TRY
BEGIN CATCH
THROW;
END CATCH
Khi thủ tục được thực thi, lỗi sau đây được nêu ra:
Msg 8134, Cấp 16, Trạng thái 1, Dòng 1
Chia không có lỗi.
Lưu ý, không có thông tin về quy trình mà lỗi được nêu ra được bao gồm. Đó là bởi vì SQL động, sai lầm được thực thi trong một phạm vi khác và điều đó là tốt. Tuy nhiên, thay đổi CATCH
-block để trông như thế này
BEGIN CATCH
THROW 50000, 'An error occurred.', 1;
END CATCH
và việc thực hiện thủ tục sẽ đưa ra lỗi này thay vào đó:
Msg 50000, Cấp 16, Trạng thái 1, Quy trình usp_division_err, Dòng 7 [Batch Start Line 0]
Xảy ra lỗi.
Lỗi vẫn gặp phải khi thực thi SQL động, nhưng khi tôi chỉ định thủ công số lỗi và thông báo lỗi (tham số thứ nhất và thứ hai của THROW
), tên thủ tục của quy trình thực thi bằng cách nào đó sẽ xuất hiện.
Tại sao tên thủ tục xuất hiện trong thông báo lỗi thứ hai mà không phải là tên đầu tiên?
FORMATMESSAGE
trong lần ném ngoài cùng của mình để nối tên SP vào Tin nhắn với OBJECT_NAME(@@PROCID)
.