Вихідні параметри та значення за замовчуванням погано працюють разом! Це з 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
коли адреса не існує, без використання гілки?"