optionale Parameter in SQL Server gespeichert proc?

125

Ich schreibe einige gespeicherte Prozesse in SQL Server 2008 und habe mich gefragt, ob das Konzept der optionalen Eingabeparameter hier möglich ist.

Ich nehme an, ich könnte immer NULL für Parameter übergeben, die ich nicht verwenden möchte, den Wert im gespeicherten Prozess überprüfen und dann Dinge von dort übernehmen, aber ich war interessiert, ob das Konzept hier verfügbar ist. Vielen Dank!

larryq
quelle
2
Lesen Sie lange auf Erlands Website, er hat einige großartige Informationen zu dynamischen Suchbedingungen
Aaron Bertrand

Antworten:

201

Sie können so deklarieren

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 Mehr
quelle
Was ist, wenn der Parameter eine eindeutige Kennung ist? Ex. @userId uniqueidentifier
RK Sharma
1
Beantwortung von @RKSharma für alle, die sich auch fragen - es funktioniert genauso mit eindeutigen Identifikatoren.
Rinukkusu
55

Ja, so ist es. Deklarieren Sie den Parameter wie folgt:

@Sort varchar(50) = NULL

Jetzt müssen Sie den Parameter nicht einmal mehr übergeben. Der Standardwert ist NULL (oder was auch immer Sie standardmäßig wählen).

Mike Cole
quelle
Sie brauchen nicht einmal die= NULL
OMG Ponys
3
Bist du sicher, dass du es nicht brauchst?
Mike Cole
43
OMG Ponys, wenn Sie nicht = <NULL | einen Standardwert> angeben, ist der Parameter erforderlich. Sie können es als NULL übergeben, aber dann verschieben Sie diese Logik einfach auf die Anwendung (en), die die Prozedur verwenden.
Aaron Bertrand
10
Hinzufügen zu Aarons Punkt. Es ist besser, "= NULL" zu verwenden, wenn Sie einem vorhandenen gespeicherten Prozess einen neuen optionalen Parameter hinzufügen. Der Grund dafür ist, dass Sie möglicherweise nicht den gesamten Code kennen, der diesen Prozess aufruft. Wenn Sie es nicht mit "= NULL" optional machen, wird es für alle Stellen, an denen Sie möglicherweise einen Wert nicht übergeben haben, unterbrochen.
Nanonerd
nanonerd: Zumindest 2014 und höher können Sie einen Standard festlegen. Dieser Fehler wird NICHT angezeigt, wenn Sie diesen Parameter nicht übergeben. Zumindest hat das 2014 bei mir so funktioniert
billpennock
0

Zumindest ab 2014 können Sie einen Standardwert festlegen, der diesen und keinen Fehler verursacht, wenn Sie diesen Parameter nicht übergeben. Teilbeispiel: Der 3. Parameter wird optional hinzugefügt. Die Ausführung der eigentlichen Prozedur mit nur den ersten beiden Parametern hat einwandfrei funktioniert

exec getlist 47,1,0

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