SQL-Funktion als Standardparameterwert?

105

Ich habe versucht, einen Standardparameterwert folgendermaßen zu ändern:

ALTER PROCEDURE [dbo].[my_sp]
@currentDate datetime = GETDATE()

und alles, was der SQL-Pre-Compiler mir gab, war dieser Fehler:

Meldung 102, Ebene 15, Status 1, Prozedur my_sp, Zeile 8 Falsche Syntax in der Nähe von '('.

Ich habe die Prozedur bereits erstellt. (Ich bin nicht sicher, ob das relevant ist.) Ich habe einen Standardwert von Null verwendet und später danach gesucht, aber das scheint nicht richtig zu sein. Kann ich das in einer Zeile machen?


Update: Ich habe die MSDN-Beschreibung der Parameter für gespeicherte Prozeduren verlassen :

[= Standard] Ist ein Standardwert für den Parameter. Wenn ein Standardwert definiert ist, kann die Funktion ausgeführt werden, ohne einen Wert für diesen Parameter anzugeben.

Hinweis:
Für CLR-Funktionen können Standardparameterwerte angegeben werden, mit Ausnahme der Datentypen varchar (max) und varbinary (max).

Wenn ein Parameter der Funktion einen Standardwert hat, muss beim Aufruf der Funktion das Schlüsselwort DEFAULT angegeben werden, um den Standardwert abzurufen. Dieses Verhalten unterscheidet sich von der Verwendung von Parametern mit Standardwerten in gespeicherten Prozeduren, bei denen das Weglassen des Parameters auch den Standardwert impliziert.

Lese ich das falsch

Danke vielmals.

user58044
quelle

Antworten:

160

Der Standardwert für den Parameter für gespeicherte Prozeduren muss Konstanten sein . Sie müssten Folgendes tun ...

ALTER Procedure [dbo].[my_sp]
@currentDate datetime = null
AS
IF @currentDate is null
SET @currentDate = getdate()
Brian Kim
quelle
36
oder SET @currentDate = COALESCE (@ currentDate, GETDATE ())
SQLMenace
Ich habe das vorher benutzt. "Ich habe einen Standardwert von Null verwendet und später danach gesucht, aber es scheint nicht richtig zu sein." Trotzdem danke Brian.
user58044
Diese Lösung ist perfekt.
R. Katnaan
35

Ich denke nicht, dass das möglich ist, Sie müssen einen Literalwert (Konstantenwert) als Standard verwenden.

Sie können dies jedoch tun:

Set @currentDate = Coalesce(@currentDate , GetDate())
Otávio Décio
quelle
13

Sie können Folgendes versuchen:

Set @CurrentDate=IsNull(@CurrentDate,GetDate())
R. Katnaan
quelle
8

Ich schließe aus den eckigen Klammern in Ihrem Beispiel, dass Sie Microsoft SQL Server verwenden.

Von MSDN :

Nur ein konstanter Wert, z. B. eine Zeichenfolge; eine Skalarfunktion (entweder eine System-, benutzerdefinierte oder CLR-Funktion); oder NULL kann standardmäßig verwendet werden.

Die Funktion GETDATE()gibt von Zeit zu Zeit einen anderen Wert zurück, sodass es sich nicht um einen konstanten Ausdruck handelt.

Bill Karwin
quelle
2

Dieser Wert ist nicht deterministisch und kann nicht verwendet werden

SQLMenace
quelle
0

Vorschlag:

Setzen Sie die Standardeinstellung auf NULL

Machen Sie den Standard GETDATE()im Frontend.

MarlonRibunal
quelle