parametri opzionali in proc memorizzato SQL Server?


125

Sto scrivendo alcuni proc memorizzati in SQL Server 2008 e mi chiedevo se il concetto di parametri di input opzionali è possibile qui?

Suppongo che potrei sempre passare NULL per i parametri che non voglio usare, controllare il valore nel proc memorizzato, quindi prendere le cose da lì, ma ero interessato se il concetto è disponibile qui. Grazie!


2
Leggi a lungo sul sito di Erland, ha alcune informazioni interessanti sulle condizioni di ricerca dinamica: sommarskog.se/dyn-search.html
Aaron Bertrand,

Risposte:


201

Puoi dichiarare così

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

cosa succede se il parametro è tipo di uniqueidentifier? ex. @userId uniqueidentifier
RK Sharma

1
Rispondere a @RKSharma per chiunque si stia chiedendo troppo: funziona allo stesso modo con identificatori unici.
rinukkusu,

55

Sì. Dichiarare il parametro in questo modo:

@Sort varchar(50) = NULL

Ora non è nemmeno necessario passare il parametro. Il valore predefinito sarà NULL (o qualunque cosa si scelga di impostare come predefinito).


Non hai nemmeno bisogno del= NULL
OMG Pony il

3
Sei sicuro di non averne bisogno?
Mike Cole,

43
Pony OMG, se non includi = <NULL | alcuni valori predefiniti>, sarà richiesto il parametro. Puoi passarlo come NULL, ma poi sposta quella logica nelle applicazioni che usano la procedura.
Aaron Bertrand,

10
Aggiungendo al punto di Aaron. È meglio usare "= NULL" se si aggiunge un nuovo parametro facoltativo a un proc memorizzato esistente. Il motivo è che potresti non essere a conoscenza di TUTTO il codice che chiama questo proc. Quindi, a meno che tu non lo renda facoltativo usando "= NULL", per tutti i posti che potresti aver perso per passare un valore, si romperà.
nanonerd,

nanonerd: almeno 2014 è possibile impostare un valore predefinito e ci vorrà e NON errore quando non si passa quel parametro. Almeno è così che ha funzionato per me nel 2014 con
billpennock,

0

2014 e versioni successive almeno è possibile impostare un valore predefinito e ci vorrà questo e NON errore quando non si passa quel parametro. Esempio parziale: il 3o parametro viene aggiunto come facoltativo. exec della procedura attuale con solo i primi due parametri ha funzionato bene

exec getlist 47,1,0

create procedure getlist
   @convId int,
   @SortOrder int,
   @contestantsOnly bit = 0
as
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.