Вихідні параметри та значення за замовчуванням погано працюють разом! Це з SQL 10.50.1617 (2008 R2). Не обманюйте себе, вважаючи, що ця конструкція магічно робить це SETзначення від вашого імені (як це зробив мій колега)!
Цей "іграшковий" ІП запитує OUTPUTзначення параметра, незалежно від того, є воно значенням за замовчуванням або 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
Якщо ви надсилаєте неініціалізоване значення (тобто NULL) для OUTPUT, ви дійсно потрапили NULLвсередину SP, а ні 0. Має сенс, для цього параметра щось передано.
declare @QR int
exec [dbo].[omgwtf] 1, @QR output
print '@QR=' + coalesce(convert(varchar, @QR),'NULL')
вихід:
wtf its NULL
@QR=NULL
Якщо ми додамо явний текст SETвід абонента, то отримаємо:
declare @QR int
set @QR = 999
exec [dbo].[omgwtf] 1, @QR output
print '@QR=' + coalesce(convert(varchar, @QR),'NULL')
і (що не дивно) результат:
@QR=999
Знову ж таки, це має сенс, параметр передається, і SP не робив явних дій зі SETзначенням.
Додати SETв OUTPUTпараметрі в SP (як ви повинні робити), але нічого від абонента не встановлені:
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
Тепер при виконанні:
declare @QR int
exec [dbo].[omgwtf] 1234, @QR output
print '@QR=' + coalesce(convert(varchar, @QR),'NULL')
Вихід:
wtf its NULL
@QR=1234
Це "стандартна" поведінка для OUTPUTобробки параметрів в SP.
Тепер щодо сюжету : Єдиний спосіб отримати значення за замовчуванням для "активації" - це взагалі не передавати OUTPUTпараметр , що IMHO мало сенсу: оскільки він налаштований як OUTPUTпараметр, це означало б повернення чогось "важливого" що слід зібрати.
declare @QR int
exec [dbo].[omgwtf] 1
print '@QR=' + coalesce(convert(varchar, @QR),'NULL')
дає цей результат:
yay its zero
@QR=NULL
Але це не вдається зафіксувати вихідні дані SP, мабуть, мета цього SP для початку.
ІМХО ця комбінація функцій - сумнівна конструкція, яку я вважав би запахом коду (ну !!)
NULLтим, що ви передаєте,@AddressIdколи адреса не існує, без використання гілки?"