de salida y los valores por defecto no funcionan bien juntos! Esto es de SQL 10.50.1617 (2008 R2). No se deje engañar creyendo que esta construcción mágicamente hace un SET
a ese valor en su nombre (¡como lo hizo mi compañero de trabajo)!
Este "juguete" SP interroga al valor del parámetro OUTPUT
, si es el valor predeterminado o 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
Si envía un valor no inicializado (es decir NULL
) para la OUTPUT
, que realmente tiene NULL
dentro de la SP, y no 0
. Tiene sentido, algo pasó para ese parámetro.
declare @QR int
exec [dbo].[omgwtf] 1, @QR output
print '@QR=' + coalesce(convert(varchar, @QR),'NULL')
salida es:
wtf its NULL
@QR=NULL
Si añadimos una explícita SET
de la persona que llama se obtiene:
declare @QR int
set @QR = 999
exec [dbo].[omgwtf] 1, @QR output
print '@QR=' + coalesce(convert(varchar, @QR),'NULL')
y la salida (sorprendente):
@QR=999
De nuevo, tiene sentido, se pasa un parámetro, y SP no tomó acción explícita a SET
un valor.
Añadir un SET
del parámetro OUTPUT
en el SP (como se supone que hacer), pero no establecen nada de la persona que llama:
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
Ahora cuando es ejecutado:
declare @QR int
exec [dbo].[omgwtf] 1234, @QR output
print '@QR=' + coalesce(convert(varchar, @QR),'NULL')
la salida es:
wtf its NULL
@QR=1234
Este es el comportamiento "estándar" para OUTPUT
gestión de parámetros en SP.
Ahora, para el giro parcela: La única manera de obtener el valor por defecto para "activar", es no pasa el parámetro OUTPUT
en absoluto, que en mi humilde opinión no tiene mucho sentido: ya que está configurado como un OUTPUT
parámetro, eso significaría devolver algo "importante" que debería ser recolectado.
declare @QR int
exec [dbo].[omgwtf] 1
print '@QR=' + coalesce(convert(varchar, @QR),'NULL')
da este resultado:
yay its zero
@QR=NULL
Pero esto no logra captar la salida SP, presumiblemente con el fin de que la SP para empezar.
mi humilde opinión esta combinación característica es una construcción dudosa que yo consideraría un código olor (uff !!)
Lo que se ve su código como? Es decir, en algún lugar estás ramificando sobre si existe una dirección. Sospecho que mi pregunta, una vez que vea esa rama, sería: "¿Por qué no llamar a sproc con' NULL' en lo que pase para '@ AddressId' cuando una dirección no existe, * sin * usar una rama?" – ruffin