【问题标题】:Why we can't set default value of datetime parameter in stored procedure = getDate()?为什么我们不能在存储过程 = getDate() 中设置 datetime 参数的默认值?
【发布时间】:2010-06-19 10:20:39
【问题描述】:

我想知道为什么我不能将 SP 日期时间参数的默认值设置为 getdate(),如下所示:

Create PROCEDURE [dbo].[UPILog]
(
    @UserID bigint,
    @ActionID smallint,
    @Details nvarchar(MAX) = null,
    @Created datetime = getdate()
)

如果我尝试保存它会给我一个编译器错误

    Msg 102, Level 15, State 1, Procedure UPILog, Line XX
    Incorrect syntax near '('.

编辑: 我知道我可以像下面那样做

Create PROCEDURE [dbo].[UPILog]
(
    @UserID bigint,
    @ActionID smallint,
    @Details nvarchar(MAX) = null,
    @Created datetime = null
)
AS
if @Created is null
    SET @Created=getdate() ...

【问题讨论】:

    标签: sql-server-2005 stored-procedures


    【解决方案1】:

    如果您想使用 @Created 作为默认值,则将 null 设置为默认参数值,如果您的 sp 中带有 null,则使用 getdate() 设置 @Created 参数。

        ...
        @CreateDate datetime = null
    )
    AS
        if @CreateDate is null
            set @CreateDate = getdate()
    ...
    

    编辑:还有文档说明:https://stackoverflow.com/a/53832983/197652

    【讨论】:

      【解决方案2】:

      您不能将函数调用用作默认参数值。

      解决方法很简单:如果未设置,请将调用参数设置为 getdate()

      【讨论】:

      • 为什么我不能使用它.. sql引擎做起来不容易吗?
      • 有什么解释为什么它不能接受这个..或者它是一个不能作为默认参数调用函数的 SQL SERVER 规则
      • 它必须是一个常数值。
      • @SpaceCracker 我相信你要做的(如果允许的话)是在编译代码时运行 getdate() 函数(记住我们'正在编译代码)并将 getdate() 的一次运行的结果存储为默认值......你不想要的东西。你想要的是它在任何时候调用你的 UPILog 函数时运行 getdate 函数,这应该/只能在函数体中完成。
      【解决方案3】:
        ....     
        @CreateDate datetime = null
      )
      

      然后像下面这样使用 COALESCE() -

      COALESCE(@CreateDate, getdate())
      

      【讨论】:

        【解决方案4】:

        简单来说,它必须是某个常数值,GetDate() 是一个函数调用。

        【讨论】:

          【解决方案5】:

          您不能将函数用作参数值。我所做的是将参数设置为一些超出范围的日期,例如“1900-01-01”,然后在 proc 中检查它。例如:

          CREATE PROC uspDataCompare  
              @CompareDate    DATE = '1900-01-01'
          AS
          
          IF  @CompareDate = '1900-01-01' SET @CompareDate = CONVERT(DATE, GETDATE())
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-08-06
            • 1970-01-01
            • 1970-01-01
            • 2014-07-18
            • 1970-01-01
            相关资源
            最近更新 更多