2010-04-23 132 views
2

另一位開發人員創建了一個存儲過程,該存儲過程設置爲每個月都作爲一個sql作業運行。它需要一個datetime參數。當我嘗試在作業中或在查詢窗口中調用它時,出現錯誤Incorrect syntax near ')'。執行它的調用是:sql作業和日期時間參數

exec CreateHeardOfUsRecord getdate() 

當我給它一個硬編碼的日期一樣exec CreateHeardOfUsRecord '4/1/2010'它工作正常。任何想法爲什麼我不能在這種情況下使用getdate()?謝謝。

+0

其實我是不正確的。參數是smalldatetime不是日期時間 – 2010-04-23 17:05:45

回答

3

通過Exec傳遞的參數must either be constants or variables。 GetDate()被分類爲一個函數。您需要聲明一個變量來保存GetDate()的結果,然後將其傳遞給存儲過程。

提供的值必須是常數 或變量;您不能指定 函數名稱作爲參數值。 變量可以是用戶定義的或 系統變量,如@@ spid。

1

通過看EXECUTE (Transact-SQL)

[ { EXEC | EXECUTE } ] 
    { 
     [ @return_status = ] 
     { module_name [ ;number ] | @module_name_var } 
     [ [ @parameter = ] { value 
          | @variable [ OUTPUT ] 
          | [ DEFAULT ] 
          } 

你只能通過在一個恆定值或一個變量或默認條款

嘗試一下:

create procedure xy_t 
@p datetime 
as 
select @p 
go 

exec xy_t GETDATE() 

輸出:

Msg 102, Level 15, State 1, Line 1 
Incorrect syntax near ')'. 
+0

OP提到datetime vs.smalldatetime,但是數據類型並不重要,它會在失敗之前失敗。使用我的示例程序嘗試'exec xy_t'10'+'2'',您會得到'Msg 102,Level 15,State 1,Line 1'+'附近的錯誤語法。' – 2010-04-23 17:22:06

0

嘗試通過轉換(VARCHAR,GETDATE(),101)

+0

您無法將表達式傳遞到存儲過程,看我的示例代碼。試試你的答案結果如下:'Msg 156,Level 15,State 1,Line 1關鍵字'Convert'附近的語法錯誤。 – 2010-04-23 17:19:45

0

這裏使用松下的代碼是一個辦法做到這一點

create procedure xy_t 
@p datetime 
as 
select @p 
go 

declare @date datetime 

set @date = getdate() 

exec xy_t @date