【问题标题】:GETDATE() causing syntax error in SQL Server 2008GETDATE() 在 SQL Server 2008 中导致语法错误
【发布时间】:2010-11-09 04:32:21
【问题描述】:

我刚刚创建了一个存储过程,在执行一些计算后将数据插入到表中。我的创建过程代码如下:

ALTER PROCEDURE [dbo].[myStoredProc] 
    @log_id INT,
    @job_nm VARCHAR(20),
    @feed_in_out_ind CHAR(1) = null,
    @process_dt DATETIME = null,
    @procedure_dt DATETIME = NULL,  
    @procedure_nm VARCHAR(20),
    @object_ty VARCHAR(20),
    @operation_ty VARCHAR(20),
    @num_records INT,
    @success_status BIT,
    @error_msg VARCHAR(50) = NULL,
    @start_time DATETIME,
    @end_time DATETIME = null
AS    

当我尝试调用存储过程时,如果我将 GETDATE() 用于任何日期时间,则会收到语法错误Incorrect syntax near ')' 当我将 GETDATE() 替换为实际日期时间时,程序运行正确。

这是我的调用代码:

EXEC myStoredProc 
    @log_id = 1, 
    @job_nm = 'It',
    @feed_in_out_ind = 'i',
    @process_dt = GETDATE(),
    @procedure_dt = GETDATE(),
    @procedure_nm = 'Test 1', 
    @object_ty = 'test',
    @operation_ty = 'test',  
    @num_records = 50, 
    @success_status = 0, 
    @error_msg = 'Hello',
    @start_time = GETDATE(),
    @end_time = GETDATE()

有什么想法吗?谢谢。

【问题讨论】:

    标签: sql sql-server-2008


    【解决方案1】:

    试试

    DECLARE @Now AS DATETIME
    SET @Now = GETDATE()
    
    EXEC myStoredProc 
        @log_id = 1, 
        @job_nm = 'It',
        @feed_in_out_ind = 'i',
        @process_dt = @Now ,
        @procedure_dt = @Now ,
        @procedure_nm = 'Test 1', 
        @object_ty = 'test',
        @operation_ty = 'test',  
        @num_records = 50, 
        @success_status = 0, 
        @error_msg = 'Hello',
        @start_time = @Now ,
        @end_time = @Now 
    

    【讨论】:

    • 很好的解决方法,但它没有对根本问题给出任何解释。
    • 那行得通 - 谢谢。问题是我将从许多其他存储过程中调用此过程。我真的需要了解造成这种情况的原因,这样才能以一种不那么“创可贴”的方式解决它。
    • 这不是创可贴。请参阅文档中此页面上的“指定参数”:msdn.microsoft.com/en-us/library/ms189915(v=SQL.100).aspx
    • 我一直使用这种技术。我不认为这是“创可贴”或缺乏解释,而是正确的做法。
    • 这是因为 GETDATE() 是一个函数,不能将函数作为参数提供给正在执行的存储过程。
    【解决方案2】:

    您不能在参数 AFAIK 中调用函数。

    我用过的东西是:

    ALTER PROCEDURE [dbo].[myStoredProc] 
         @process_dt DATETIME = null
    
    AS   
    
    IF @process_dt IS NULL
        BEGIN       
            SET @TimeComplete = GETDATE()
        END 
    

    为您现在要默认的每个变量添加一个。或者,在 proc (INSIDE IT) 的开头声明一个变量,并将所有时间设置为该变量。这样它们在内部是一致的(之间没有毫秒变化)。

    【讨论】:

      【解决方案3】:

      存储的 proc 参数采用常量或 NULL 作为默认值

      来自CREATE PROCEDURE

      默认

      是参数的默认值。如果定义了默认值,则无需为该参数指定值即可执行过程。默认值必须是常量,也可以为 NULL。

      通常我会在存储过程中使用SET @dtparam = ISNULL(@dtparam, GETDATE())

      【讨论】:

      • @JNK:否则我有那么糟糕吗?
      • 一点也不。不过,如果有什么不正确的,你就不会出拳。
      【解决方案4】:

      我怀疑您遇到问题的原因是您试图在存储过程的参数中调用函数。

      自从我研究存储过程的工作原理以来已经一年多了,如果我的记忆正确,您应该能够将当前时间存储到局部变量中并使用该值。

      我想我发帖的速度很慢,因为“解决方法”正是我所建议的:$

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-03-17
        • 1970-01-01
        • 2015-02-14
        • 1970-01-01
        • 2017-04-01
        • 1970-01-01
        • 2017-07-22
        相关资源
        最近更新 更多