2012-03-06 52 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