Função SQL como valor de parâmetro padrão?

105

Tentei alterar um valor de parâmetro padrão com isto:

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

e tudo o que o pré-compilador SQL me deu foi este erro:

Msg 102, nível 15, estado 1, procedimento my_sp, linha 8 Sintaxe incorreta próxima a '('.

Já criei o procedimento. (Não tenho certeza se isso é relevante.) Eu estava usando um valor padrão nulo e verificando isso mais tarde, mas isso não parece adequado. Posso fazer isso em uma linha?


Atualização: eu estava saindo da descrição dos parâmetros de procedimento armazenado do MSDN :

[= padrão] É um valor padrão para o parâmetro. Se um valor padrão for definido, a função pode ser executada sem especificar um valor para aquele parâmetro.

Nota: Os
valores de parâmetro padrão podem ser especificados para funções CLR, exceto para os tipos de dados varchar (max) e varbinary (max).

Quando um parâmetro da função possui um valor padrão, a palavra-chave DEFAULT deve ser especificada quando a função é chamada para recuperar o valor padrão. Esse comportamento é diferente de usar parâmetros com valores padrão em procedimentos armazenados, nos quais omitir o parâmetro também implica no valor padrão.

Eu estou lendo errado?

Muito Obrigado.

user58044
fonte

Respostas:

160

O valor padrão para o parâmetro de procedimentos armazenados deve ser constante . Você precisa fazer o seguinte ...

ALTER Procedure [dbo].[my_sp]
@currentDate datetime = null
AS
IF @currentDate is null
SET @currentDate = getdate()
Brian Kim
fonte
36
ou SET @currentDate = COALESCE (@ currentDate, GETDATE ())
SQLMenace
Eu estava usando isso anteriormente. "Eu estava usando um valor padrão nulo e verificando isso mais tarde, mas não parece adequado." Ainda obrigado Brian.
user58044
Esta solução é perfeita.
R.Katnaan
35

Não acho que seja possível, você tem que usar um valor literal (constante) como padrão.

No entanto, você pode fazer isso:

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

Você pode tentar o seguinte:

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

Eu deduzo que você está usando o Microsoft SQL Server pelos colchetes em seu exemplo.

Do MSDN :

Apenas um valor constante, como uma string de caracteres; uma função escalar (um sistema, definido pelo usuário ou função CLR); ou NULL pode ser usado como padrão.

A função GETDATE()retorna um valor diferente de vez em quando, portanto, não é uma expressão constante.

Bill Karwin
fonte
2

Esse valor não é determinístico e não pode ser usado

SQLMenace
fonte
0

Sugestão:

Defina o padrão para NULL

Faça o padrão GETDATE()no front end.

Tribunal Marlon
fonte