2010-11-08 60 views
2

我剛剛創建了一個存儲過程,在執行一些計算後將數據插入到表中。我創建程序代碼如下:GETDATE()在SQL Server 2008中導致語法錯誤

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

任何想法?謝謝。

回答

3

嘗試

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 
+2

大的解決方法,但它並沒有給潛在的問題作出任何解釋。 – 2010-11-08 19:19:11

+0

工作 - 謝謝。問題是我將從許多其他存儲過程調用此過程。我真的需要明白是什麼引起了這個問題,所以可以用一種不太「繃帶式」的方式解決問題。 – chama 2010-11-08 19:19:40

+3

這不是一個創可貼。請參閱以下文檔中的「指定參數」:http://msdn.microsoft.com/zh-cn/library/ms189915(v=SQL.100).aspx。 – Anna 2010-11-08 19:42:11

0

我懷疑你是有問題的原因是您正在嘗試一個存儲過程的參數中調用的函數。

自從我研究存儲過程如何正確工作已經過去了一年,如果我的記憶是正確的,您應該能夠將當前時間存儲到本地變量並使用該值。

我想我是慢發佈,因爲「解決辦法」正是我建議:$

3

中的參數不能調用函數AFAIK。我已經使用

的東西是:

ALTER PROCEDURE [dbo].[myStoredProc] 
    @process_dt DATETIME = null 

AS 

IF @process_dt IS NULL 
    BEGIN  
     SET @TimeComplete = GETDATE() 
    END 

添加那些爲每個要默認爲現在的變量之一。或者,在proc(INSIDE IT)的開頭聲明一個變量,並設置所有時間。這樣他們是內部一致的(沒有毫秒之間的差異)。

2

存儲過程的參數需要常量或NULL作爲默認

CREATE PROCEDURE

默認

是參數的默認值。如果定義了默認值,則可以執行該過程而不指定該參數的值。缺省值必須是常量或可以爲NULL。

一般情況下我做SET @dtparam = ISNULL(@dtparam, GETDATE())在存儲過程

+0

+1 - gbn同意w/me!:) – JNK 2010-11-09 11:52:43

+0

@JNK:難道我不好嗎? – gbn 2010-11-09 18:14:01

+0

完全沒有。不過,如果出現不正確的情況,你將不會出拳。 – JNK 2010-11-09 18:15:35