paramètres facultatifs dans SQL Server stocké proc?

125

J'écris des procs stockés dans SQL Server 2008 et je me suis demandé si le concept de paramètres d'entrée facultatifs est possible ici?

Je suppose que je pourrais toujours passer NULL pour les paramètres que je ne veux pas utiliser, vérifier la valeur dans le processus stocké, puis prendre les choses à partir de là, mais j'étais intéressé si le concept est disponible ici. Merci!

Larryq
la source
2
Lisez longuement sur le site d'Erland, il a d'excellentes informations sur les conditions de recherche dynamiques: sommarskog.se/dyn-search.html
Aaron Bertrand

Réponses:

201

Vous pouvez déclarer comme ça

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 Plus
la source
et si le paramètre est le type d'identifiant unique? ex. @userId uniqueidentifier
RK Sharma
1
Répondre à @RKSharma pour tous ceux qui se demandent aussi - cela fonctionne de la même manière avec des identifiants uniques.
rinukkusu
55

Oui, ça l'est. Déclarez le paramètre comme suit:

@Sort varchar(50) = NULL

Vous n'avez même plus besoin de passer le paramètre. Il sera par défaut NULL (ou ce que vous choisissez par défaut).

Mike Cole
la source
Vous n'avez même pas besoin du= NULL
OMG Ponies
3
Etes-vous sûr que vous n'en avez pas besoin?
Mike Cole
43
OMG Ponies, si vous n'incluez pas = <NULL | une valeur par défaut>, le paramètre sera requis. Vous pouvez le transmettre en tant que NULL, mais il vous suffit ensuite de déplacer cette logique vers la ou les applications qui utilisent la procédure.
Aaron Bertrand
10
Ajoutant au point d'Aaron. Il est préférable d'utiliser "= NULL" si vous ajoutez un nouveau paramètre facultatif à un processus stocké existant. La raison en est que vous ne connaissez peut-être pas TOUT le code qui appelle ce proc. Par conséquent, à moins que vous ne le rendiez facultatif en utilisant "= NULL", pour tous les endroits que vous avez peut-être manqués pour passer une valeur, il se cassera.
nanonerd
nanonerd: 2014 et au-dessus au moins, vous pouvez définir une valeur par défaut et cela prendra cela et PAS une erreur lorsque vous ne passez pas ce paramètre. Au moins, c'est ainsi que cela a fonctionné pour moi en 2014 avec
billpennock
0

2014 et au-dessus au moins, vous pouvez définir une valeur par défaut et cela prendra cela et PAS une erreur lorsque vous ne transmettez pas ce paramètre. Exemple partiel: le 3ème paramètre est ajouté en option. L'exécution de la procédure réelle avec seulement les deux premiers paramètres a bien fonctionné

exec getlist 47,1,0

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