【问题标题】:Executing stored procedure in T-SQL with dates as parameters [duplicate]在T-SQL中以日期为参数执行存储过程[重复]
【发布时间】:2015-02-04 18:49:14
【问题描述】:

我需要创建一个以供应商名称、开始日期和结束日期为参数的存储过程,并计算该供应商在给定时间间隔内的总收入。我正在使用北风。过程如下:

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 年附近的语法错误”。我错过了什么?

【问题讨论】:

  • 您不能在存储过程参数列表中使用函数调用。只需使用字符串文字,例如'1900-01-01'

标签: sql-server tsql date stored-procedures


【解决方案1】:

函数的大括号

  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;

【讨论】:

  • Duh.. 唯一我没有尝试过的事情。简单,但现在很明显。谢谢!
猜你喜欢
  • 2016-07-17
  • 2017-03-30
  • 1970-01-01
  • 2021-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多