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.

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

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

13

Você pode tentar o seguinte:

Set @CurrentDate=IsNull(@CurrentDate,GetDate())

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.


2

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


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.