在日期作为参数的T-SQL中执行存储过程

时间:2014-12-06 19:29:31

标签: sql-server tsql date stored-procedures

我需要创建一个存储过程,它将supplierName,startDate和endDate作为参数,并计算给定时间间隔内该供应商的总收入。我正在使用Northwind。程序如下:

CREATE PROC usp_GetTotalIncomeByPeriod (
    @companyName nvarchar(40),
    @startDate date,
    @endDate date)
AS
    BEGIN
        SELECT SUM(od.UnitPrice * od.Quantity * (1 - od.Discount))
        FROM Orders o
            JOIN [Order Details] od
                ON o.OrderId = od.OrderId
            JOIN Products p
                ON od.ProductID = p.ProductID
            JOIN Suppliers s
                ON p.SupplierID = s.SupplierID
        WHERE s.CompanyName = @companyName
            AND (o.OrderDate BETWEEN @startDate AND @endDate);
    END
GO

问题在于我无法使用以下调用实际执行它:

EXEC dbo.usp_GetTotalIncomeByPeriod @companyName = 'Exotic Liquids', 
                                    @startDate = DATEFROMPARTS(1900, 01, 01),
                                    @endDate = DATEFROMPARTS(2000, 1, 1);

DATEFROMPARTS函数似乎可以自行运行,但我无法让它作为参数工作。它经常在1900'附近给出我不正确的语法。我错过了什么?

1 个答案:

答案 0 :(得分:4)

函数的大括号

  DATEFROMPARTS()

导致错误。 因此,要么在没有函数的情况下直接传递日期,要么使用PLSQL块通过将DATEFROMPARTS()的结果存储在变量中,然后将变量传递给存储过程。

 DECLARE    
    @return_value int,
    @vDate1 date,
    @vDate2 date

SET @vDate1=DATEFROMPARTS(1900, 01, 01);
SET @vDate2=DATEFROMPARTS(2000, 01, 01);

EXEC @return_value = dbo.usp_GetTotalIncomeByPeriod 
                                @companyName = 'Exotic Liquids', 
                                @startDate = @vDate1,
                                @endDate = @vDate2;