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 SET
thay 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 OUTPUT
giá 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ó NULL
bê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 SET
từ 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 SET
một giá trị.
Thêm một SET
trong những OUTPUT
tham 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" để OUTPUT
xử 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 OUTPUT
tham số , điều mà IMHO có chút ý nghĩa: vì nó được thiết lập như một OUTPUT
tham 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 !!)
NULL
bất cứ thứ gì bạn chuyển cho@AddressId
khi một địa chỉ không tồn tại, mà không sử dụng nhánh?"