当我尝试从Management Studio执行以下声明时,它已成功执行 -
exec [sp_GetAllBillsForDate] '03/06/2012','03/06/2012'
但是当我把它改成
时exec [sp_GetAllBillsForDate] getdate(), getdate()
它正在生成错误
Incorrect syntax near ')'.
这有什么不对吗?
感谢您分享您的时间。
答案 0 :(得分:2)
答案是您不能将函数作为参数传递给存储过程参数。
如果您只想在不想传入值时使用当前日期/时间,为什么不通过在过程中提供默认值来使这些参数成为可选项?这将使您不必键入它,声明局部变量,甚至更重要的是从客户端应用程序传递这些无用的令牌。
您还应该避免模糊的日期格式,如m / d / y和d / m / y。如果它现在不是March,我不知道你的意思是3月6日还是6月3日。当你在不同的区域或语言设置的某个地方运行代码时,SQL Server也可能会出错。明确地以明确的格式(例如YYYYMMDD
)对语言,地区或人类感知问题免疫。
无论如何这里是带有可选参数的程序:
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 @date1 = '20120306', @date2 = '20120306';
为了得到今天:
EXEC dbo.sp_GetAllBillsForDate;
(同样明确地命名参数也是个好主意。然后你不必担心参数顺序的改变。而且在引用或创建所有对象时总是使用模式前缀。)
答案 1 :(得分:1)
尝试传递变量..
DECLARE @date1 DATETIME
,@date2 DATETIME
SELECT @date1 = GETDATE()
,@date2 = GETDATE()
EXEC [sp_GetAllBillsForDate] @date1, @date2