Функция SQL как значение параметра по умолчанию?

105

Я попытался изменить значение параметра по умолчанию следующим образом:

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

и все, что дал мне предварительный компилятор SQL, было этой ошибкой:

Msg 102, уровень 15, состояние 1, процедура my_sp, строка 8 Неправильный синтаксис рядом с '('.

Я уже создал процедуру. (Я не уверен, что это актуально.) Я использовал значение по умолчанию null и проверял его позже, но это не кажется правильным. Могу я сделать это одной строкой?


Обновление: я отказался от описания параметров хранимой процедуры в MSDN :

[= default] Значение параметра по умолчанию. Если определено значение по умолчанию, функция может быть выполнена без указания значения для этого параметра.

Примечание.
Для функций CLR могут быть указаны значения параметров по умолчанию, за исключением типов данных varchar (max) и varbinary (max).

Когда параметр функции имеет значение по умолчанию, ключевое слово DEFAULT должно быть указано при вызове функции для получения значения по умолчанию. Это поведение отличается от использования параметров со значениями по умолчанию в хранимых процедурах, в которых исключение параметра также подразумевает значение по умолчанию.

Я неправильно это читаю?

Большое спасибо.

user58044
источник

Ответы:

161

Значение по умолчанию для параметра хранимых процедур должно быть постоянным . Вам нужно будет сделать следующее ...

ALTER Procedure [dbo].[my_sp]
@currentDate datetime = null
AS
IF @currentDate is null
SET @currentDate = getdate()
Брайан Ким
источник
36
или SET @currentDate = COALESCE (@ currentDate, GETDATE ())
SQLMenace,
Я использовал это раньше. «Я использовал нулевое значение по умолчанию и проверял это позже, но это кажется неправильным». Тем не менее спасибо, Брайан.
user58044
Это решение идеальное.
Р.Катнаан
35

Я не думаю, что это возможно, вы должны использовать буквальное (постоянное) значение по умолчанию.

Однако вы можете сделать это:

Set @currentDate = Coalesce(@currentDate , GetDate())
Отавио Десио
источник
13

Вы можете попробовать следующее:

Set @CurrentDate=IsNull(@CurrentDate,GetDate())
Р.Катнаан
источник
8

Я предполагаю, что вы используете Microsoft SQL Server из квадратных скобок в вашем примере.

Из MSDN :

Только постоянное значение, например символьная строка; скалярная функция (системная, определяемая пользователем или функция CLR); или NULL можно использовать по умолчанию.

Функция GETDATE()время от времени возвращает другое значение, поэтому это не постоянное выражение.

Билл Карвин
источник
2

Это значение не детерминировано и не может использоваться.

SQLMenace
источник
0

Предложение:

Установите значение по умолчанию на NULL

Сделайте Default GETDATE()во внешнем интерфейсе.

МарлонРибунал
источник