opcjonalne parametry w SQL Server przechowywane proc?

125

Piszę kilka procesów przechowywanych w SQL Server 2008 i zastanawiałem się, czy koncepcja opcjonalnych parametrów wejściowych jest tutaj możliwa?

Przypuszczam, że zawsze mógłbym przekazać NULL dla parametrów, których nie chcę używać, sprawdzić wartość w przechowywanym procencie, a następnie wziąć rzeczy stamtąd, ale byłem zainteresowany, czy koncepcja jest tutaj dostępna. Dzięki!

larryq
źródło
2
Poczytaj
Aaron Bertrand

Odpowiedzi:

201

Możesz tak zadeklarować

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 Więcej
źródło
co jeśli parametr jest typem unikalnego identyfikatora? dawny. @userId uniqueidentifier
RK Sharma
1
Odpowiadanie @RKSharma każdemu, kto też się zastanawia - działa tak samo z unikalnymi identyfikatorami.
rinukkusu
55

Tak to jest. Zadeklaruj parametr jako taki:

@Sort varchar(50) = NULL

Teraz nie musisz nawet przekazywać parametru. Wartość domyślna to NULL (lub cokolwiek wybierzesz jako domyślne).

Mike Cole
źródło
Nie potrzebujesz nawet= NULL
OMG Kucyki
3
Czy na pewno tego nie potrzebujesz?
Mike Cole
43
OMG Kucyki, jeśli nie dodasz = <NULL | jakiejś wartości domyślnej>, to parametr będzie wymagany. Możesz przekazać to jako NULL, ale potem po prostu przenieś tę logikę do aplikacji, które używają tej procedury.
Aaron Bertrand
10
Dodając do punktu Aarona. Lepiej jest użyć "= NULL", jeśli dodajesz nowy opcjonalny parametr do istniejącego zapisanego procesu. Powodem jest to, że możesz nie być świadomy CAŁEGO kodu, który wywołuje ten proces. Dlatego jeśli nie ustawisz go jako opcjonalnego za pomocą „= NULL”, dla wszystkich miejsc, które mogłeś przegapić, aby przekazać wartość, ulegnie awarii.
nanonerd
nanonerd: 2014 i powyżej przynajmniej możesz ustawić wartość domyślną i to zajmie, a NIE błąd, jeśli nie przekażesz tego parametru. Przynajmniej tak to działało w 2014 roku
billpennock
0

2014 i powyżej przynajmniej możesz ustawić wartość domyślną i zajmie to, a NIE błąd, jeśli nie przekażesz tego parametru. Częściowy przykład: trzeci parametr jest dodawany jako opcjonalny. exec rzeczywistej procedury z tylko pierwszymi dwoma parametrami działały poprawnie

exec getlist 47,1,0

create procedure getlist
   @convId int,
   @SortOrder int,
   @contestantsOnly bit = 0
as
billpennock
źródło