第一个存储过程 - 无法使变量起作用

时间:2011-11-25 19:35:28

标签: sql-server stored-procedures

这是我编写存储过程的第一个镜头。我正在尝试获取两个日期之间所有订单的清单。我会每月运行此程序,获得过去6个月的订单。如果我在本月的2日或15日运行它,它仍然需要从上个月末开始的前6个月。

以下是代码:

CREATE PROCEDURE pMonthlyCustomerReport 
    -- Get the last day of the previous month and the first day of 6 months ago
    @enddate date,
    @startdate date
AS
    SET @enddate = DATEADD(D,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE()),0));
    SET @startdate = DATEADD(M, DATEDIFF(MONTH, 0, GETDATE())-6, 0);

    -- Get orders for the past 6 months
    SELECT acct_num, date as OrderDate, type as OrderType
    INTO #Orders
    FROM rders
    WHERE date BETWEEN @startdate AND @enddate;

当我运行proc时,我收到此错误消息:

  

过程或函数'pMonthlyCustomerReport'需要参数'@enddate',这是未提供的。

我应该在这里使用的任何建议或最佳做法?我可能过度思考创建@enddate@startdate并且应该将它们放在查询中,但我希望预先声明变量。

有什么想法吗?

谢谢

4 个答案:

答案 0 :(得分:2)

您可以声明变量@startdate和@enddate而不是将它们作为sp的参数,因为您无论如何都是根据当前日期设置它们:

DECLARE @startdate datetime
DECLARE @enddate datetime

然后声明如下:

CREATE PROCEDURE pMonthlyCustomerReport 
AS

答案 1 :(得分:2)

这里有两个问题。第一个是你声明你没有提供值的输入参数(这显然不是你的意图)。解决方案:将它们放在AS之后并使用DECLARE将它们声明为局部变量。

第二个问题是您正在尝试设置声明的输入参数的值。第一次更改将解决此问题。

答案 2 :(得分:1)

declare @enddate date
declare @startdate date

之后

AS

所以它们不会被声明为调用过程时必须提供的参数。

答案 3 :(得分:0)

您要求参数,使用声明语句将@enddate和@startdate更改为局部变量。