2014-12-06 100 views
0

我需要创建一个存储过程,该存储过程将supplierName,startDate和endDate作为参数,并计算给定间隔内该供应商的总收入。我正在使用Northwind。过程如下所示:以日期为参数在T-SQL中执行存储过程

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 

的问题是,我不能使用以下invokation实际执行它:

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

的DATEFROMPARTS功能似乎对自己工作得很好,但我不能设法使其成为参数。它不断给我'1900附近的错误语法'。我错过了什么?

+0

您不能在存储过程参数列表中使用函数调用。只需使用诸如“1900-01-01”之类的字符串文字即可。 – 2014-12-06 20:06:53

回答

3

功能

DATEFROMPARTS() 

的括号导致错误。 因此,不通过函数直接传递日期,或者通过将DATEFROMPARTS()的结果存储在变量中,然后将该变量传递给存储过程来使用PLSQL块来完成此操作。

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; 
+0

Duh ..我唯一没有尝试的东西。简单,但现在很明显。谢谢! – zhulien 2014-12-06 20:08:51