exec语句问题

时间:2012-03-06 01:51:05

标签: sql-server-2005 ssms

当我尝试从Management Studio执行以下声明时,它已成功执行 -

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 个答案:

答案 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