Функція SQL як значення параметра за замовчуванням?


105

Я спробував змінити значення параметра за замовчуванням за допомогою цього:

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

і всі попередні компілятори SQL дали мені цю помилку:

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

Я вже створив процедуру. (Я не впевнений, чи це актуально.) Я використовував нульове значення за замовчуванням і перевіряв це на пізніше, але це не здається правильним. Чи можу я це зробити одним рядком?


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

[= default] - це значення за замовчуванням для параметра. Якщо визначено значення за замовчуванням, функцію можна виконати, не вказуючи значення для цього параметра.

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

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

Чи читаю я це неправильно?

Велике дякую.

Відповіді:


160

Значення за замовчуванням для параметра, що зберігається, має бути константами . Вам потрібно буде зробити наступне ...

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())


8

Я вважаю, що ви використовуєте Microsoft SQL Server із квадратних дужок у вашому прикладі.

Від MSDN :

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

Функція GETDATE()час від часу повертає різні значення, тому це не є постійним виразом.


2

Це значення не є детермінованим і не може бути використане


0

Пропозиція:

Встановіть значення за замовчуванням на NULL

Виконайте за замовчуванням GETDATE()на передньому кінці.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.