parámetros opcionales en el procedimiento almacenado de SQL Server?

125

Estoy escribiendo algunos procedimientos almacenados en SQL Server 2008, y me pregunté si el concepto de parámetros de entrada opcionales es posible aquí.

Supongo que siempre podría pasar NULL para los parámetros que no quiero usar, verificar el valor en el proceso almacenado, luego tomar las cosas desde allí, pero estaba interesado si el concepto está disponible aquí. ¡Gracias!

larryq
fuente
2
Lea detenidamente en el sitio de Erland, tiene una gran información sobre las condiciones de búsqueda dinámica: sommarskog.se/dyn-search.html
Aaron Bertrand

Respuestas:

201

Puedes declarar así

CREATE PROCEDURE MyProcName
    @Parameter1 INT = 1,
    @Parameter2 VARCHAR (100) = 'StringValue',
    @Parameter3 VARCHAR (100) = NULL
AS

/* check for the NULL / default value (indicating nothing was passed */
if (@Parameter3 IS NULL)
BEGIN
    /* whatever code you desire for a missing parameter*/
    INSERT INTO ........
END

/* and use it in the query as so*/
SELECT *
FROM Table
WHERE Column = @Parameter
Raj Más
fuente
¿Qué pasa si el parámetro es tipo de identificador único? ex. @userId uniqueidentifier
RK Sharma
1
Respondiendo @RKSharma para cualquiera que se pregunte también: funciona igual con identificadores únicos.
rinukkusu
55

Sí lo es. Declare el parámetro así:

@Sort varchar(50) = NULL

Ahora ni siquiera tiene que pasar el parámetro. Su valor predeterminado será NULL (o lo que elija).

Mike Cole
fuente
Ni siquiera necesita el= NULL
OMG potros
3
¿Estás seguro de que no lo necesitas?
Mike Cole el
43
OMG Ponies, si no incluye = <NULL | algún valor predeterminado>, entonces se requerirá el parámetro. Puede pasarlo como NULL, pero luego simplemente cambia esa lógica a las aplicaciones que usan el procedimiento.
Aaron Bertrand
10
Agregando al punto de Aaron. Es mejor usar "= NULL" si está agregando un nuevo parámetro opcional a un proceso almacenado existente. La razón es que es posible que no conozca TODO el código que llama a este proceso. Por lo tanto, a menos que lo haga opcional usando "= NULL", para todos los lugares que puede haber pasado por alto en un valor, se romperá.
nanonerd
nanonerd: 2014 y superior, al menos, puede establecer un valor predeterminado y tomará eso y NO un error cuando no pase ese parámetro. Al menos esa es la forma en que trabajó para mí en 2014 con
billpennock
0

2014 y superior, al menos, puede establecer un valor predeterminado y tomará eso y NO un error cuando no pase ese parámetro. Ejemplo parcial: el tercer parámetro se agrega como opcional. exec del procedimiento real con solo los dos primeros parámetros funcionó bien

exec getlist 47,1,0

create procedure getlist
   @convId int,
   @SortOrder int,
   @contestantsOnly bit = 0
as
Billpennock
fuente