Trong SQL Server 2008 (nhưng cũng trong năm 2014). Hãy xem xét một thủ tục có một tham số đầu ra. Quy trình này có thể tạo ra lỗi (và sẽ trong ví dụ sau). Tôi lưu ý rằng hành vi của tham số đầu ra không giống nhau nếu chúng ta gọi thủ tục trong khối TRY
/ CATCH
.
Thí dụ:
create procedure test_output @result varchar(10) output
as
begin
set @result = 'hello'
raiserror('This is an error', 16,1)
set @result = 'error'
end
Nếu chúng tôi khởi chạy thủ tục một cách đơn giản:
declare @res1 varchar(10)
exec test_output @result = @res1 out
print 'Result is: '+ isnull(@res1, 'empty')
chúng tôi nhận được (và tôi ổn với nó):
Msg 50000, Cấp 16, Trạng thái 1, Quy trình kiểm tra thủ tục, Dòng 7 [Batch Start Line 12]
Đây là một lỗi
Kết quả là: lỗi
Nếu quy trình hiện đang ở trong khối thử / bắt:
declare @res2 varchar(10)
declare @error_message varchar(max)
begin try
exec test_output @result = @res2 out
end try
begin catch
set @error_message = error_message()
raiserror(@error_message, 16,1)
print 'Result is: '+ isnull(@res2, 'empty')
end catch
chúng tôi nhận được (và tôi buồn):
Msg 50000, Cấp 16, Bang 1, Dòng 28
Đây là lỗi
Kết quả là: trống
Thông báo lỗi là OK, nhưng tham số đầu ra bây giờ là NULL . Nếu, trong một TRY...CATCH
bối cảnh, việc thực thi bị dừng lại ngay sau đó RAISERROR
, tôi đã dự kiến giá trị đầu ra sẽ được đặt thành hello .
Tại sao nó như vậy?