2012-03-06 39 views
0

當我試圖進行以下從Management Studio中的語句,它成功地執行 -問題與exec語句

exec [sp_GetAllBillsForDate] '03/06/2012','03/06/2012' 

enter image description here

但是,當我將其更改爲

exec [sp_GetAllBillsForDate] getdate(), getdate() 

enter image description here

它生成錯誤

Incorrect syntax near ')'. 

這是怎麼回事?

感謝分享你的時間。

回答

2

答案是,你不能將一個函數作爲參數傳遞給存儲過程的參數。

如果您只是想在當您不想傳入值時使用當前日期/時間,爲什麼不通過在過程中提供默認值來使這些參數可選?這將使您不必鍵入它,聲明局部變量,甚至更重要的是從客戶端應用程序傳遞無用的令牌。

你還應該避免含糊不清的日期格式,如m/d/y和d/m/y。如果現在不是3月份,我不知道你的意思是3月6日還是6月3日。而當你在不同區域或語言設置的地方運行代碼時,SQL Server可能也會錯誤。以明確的格式(例如YYYYMMDD)明確說明它不受語言,地區或人類感知問題的影響。

反正這裏是帶有可選參數的過程:

EXEC dbo.sp_GetAllBillsForDate @date1 = '20120306', @date2 = '20120306'; 

而獲得今天:

ALTER PROCEDURE dbo.sp_GetAllBillsForDate -- sp_ is a horrible prefix, by the way * 
    @date1 DATETIME = GETDATE(), 
    @date2 DATETIME = GETDATE() 
AS 
BEGIN 
    SET NOCOUNT ON; 
    ... 
END 
GO 

現在的硬編碼的日期代碼

EXEC dbo.sp_GetAllBillsForDate; 

(明確指定參數也是一個好主意,然後你不必擔心參數順序的改變。並且還引用或創建的所有對象時,總是使用模式前綴。)

+0

感謝阿龍您的快速回復。另一個感謝糾正我和+1爲我提供了爲什麼我不應該使用sp_前綴的原因。 – IrfanRaza 2012-03-06 03:59:26

1

嘗試通過可變..

DECLARE @date1 DATETIME 
     ,@date2 DATETIME 

SELECT @date1 = GETDATE() 
     ,@date2 = GETDATE() 

EXEC [sp_GetAllBillsForDate] @date1, @date2