Tham số đầu ra và giá trị mặc định không hoạt động tốt với nhau! Đây là từ SQL 10.50.1617 (2008 R2). Đừng để bị lừa khi tin rằng công trình này SETthay mặt bạn thực hiện một cách kỳ diệu giá trị đó (giống như đồng nghiệp của tôi đã làm)!
SP "đồ chơi" này thẩm vấn OUTPUTgiá trị tham số, cho dù đó là giá trị mặc định hay NULL.
CREATE PROCEDURE [dbo].[omgwtf] (@Qty INT, @QtyRetrieved INT = 0 OUTPUT)
AS
IF @QtyRetrieved = 0
BEGIN
print 'yay its zero'
END
IF @QtyRetrieved is null
BEGIN
print 'wtf its NULL'
END
RETURN
Nếu bạn gửi một giá trị chưa được khởi tạo (tức là NULL) cho OUTPUT, thì bạn thực sự có NULLbên trong SP, còn không 0. Có lý, một cái gì đó đã được chuyển cho tham số đó.
declare @QR int
exec [dbo].[omgwtf] 1, @QR output
print '@QR=' + coalesce(convert(varchar, @QR),'NULL')
đầu ra là:
wtf its NULL
@QR=NULL
Nếu chúng tôi thêm một SETtừ rõ ràng từ người gọi, chúng tôi nhận được:
declare @QR int
set @QR = 999
exec [dbo].[omgwtf] 1, @QR output
print '@QR=' + coalesce(convert(varchar, @QR),'NULL')
và đầu ra (không ngạc nhiên):
@QR=999
Một lần nữa, có lý, một tham số được truyền và SP không có hành động rõ ràng nào đối với SETmột giá trị.
Thêm một SETtrong những OUTPUTtham số trong các SP (như bạn đang phải làm), nhưng không đặt bất cứ điều gì từ người gọi:
ALTER PROCEDURE [dbo].[omgwtf] (@Qty INT, @QtyRetrieved INT = 0 OUTPUT)
AS
IF @QtyRetrieved = 0
BEGIN
print 'yay its zero'
END
IF @QtyRetrieved is null
BEGIN
print 'wtf its NULL'
END
SET @QtyRetrieved = @Qty
RETURN
Bây giờ khi được thực thi:
declare @QR int
exec [dbo].[omgwtf] 1234, @QR output
print '@QR=' + coalesce(convert(varchar, @QR),'NULL')
đầu ra là:
wtf its NULL
@QR=1234
Đây là hành vi "tiêu chuẩn" để OUTPUTxử lý tham số trong SP.
Bây giờ đối với cốt truyện : Cách duy nhất để lấy giá trị mặc định để "kích hoạt", là hoàn toàn không chuyển OUTPUTtham số , điều mà IMHO có chút ý nghĩa: vì nó được thiết lập như một OUTPUTtham số, điều đó có nghĩa là trả về một thứ gì đó "quan trọng" điều đó nên được thu thập.
declare @QR int
exec [dbo].[omgwtf] 1
print '@QR=' + coalesce(convert(varchar, @QR),'NULL')
cung cấp đầu ra này:
yay its zero
@QR=NULL
Nhưng điều này không thể nắm bắt được đầu ra SP, có lẽ là mục đích của SP đó để bắt đầu.
IMHO sự kết hợp tính năng này là một cấu trúc đáng ngờ mà tôi sẽ coi là một mùi mã (phew !!)
NULLbất cứ thứ gì bạn chuyển cho@AddressIdkhi một địa chỉ không tồn tại, mà không sử dụng nhánh?"