0

我有一个存储过程,可以计算给定日期期间的预测销售数据。

ALTER PROCEDURE [dbo].[CalculateMonthlyForecast]
    @CustomerID Int = -1,
    @ProductID Int = -1,
    @ForecastDate DateTime = NULL,
    @StartDate DateTime,
    @FinishDate DateTime
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Calculates each month's forecast as an individual row
    SELECT  [Year], [MonthNumber], [BaseSales], [ForecastSales]
    FROM    dbo.GetMonthlyForecast(@CustomerID, @ProductID, @StartDate, @FinishDate,     @ForecastDate)
END

这运行良好并产生了我期望的值。我在实体框架设计器中创建了一个函数导入,它应该将这些结果作为复杂类型 MonthlyForecastResult 的集合引入。我遇到的问题是 MonthlyForecastResult 对象中的值与存储过程生成的值不同。

查看 SQL Server Profiler 中的跟踪,我可以看到调用函数时实体框架生成的 EXEC 调用。直接在 SQL Server 中执行存储过程(使用生成的调用)会返回正确的结果,但函数返回的 MonthlyForecastResult 对象与存储过程结果的值不同。

此外,BaseSales 和 ForecastSales 值在 MonthlyForecastResult 对象中始终是相同的值,即使它们在存储过程的结果中非常不同。

我唯一能想到的可能是导致它与实体键混淆,但即使只返回 1 行也会出现问题,而且我不会想到实体键会在复杂类型上发挥作用反正对象。

更新

我今天在更新应用程序的生产版本后发现,我遇到的问题似乎只发生在开发环境中。在连接到其数据库的客户端服务器上运行应用程序似乎产生了正确的数字(因为我预计基本销售额和预测销售额之间存在差异)。这看起来很奇怪,因为我使用开发数据库中的确切定义更新了他们的数据库,并通过使用干净的设置重新安装它来更新应用程序,所以它也应该是相同的。

例子

如果我要求它计算 2012 年 9 月的每月预测,则 EF 生成的执行调用在 SQL Server Profiler 中显示为:

exec [dbo].[CalculateMonthlyForecast] @CustomerID=1,@ProductID=2,@ForecastDate=NULL,@StartDate='2012-09-01',@FinishDate='2012-10-01'

如果我复制它并在 SQL Server 中运行它,我会返回三行:

年月基销售预测销售
2012 8 660 660
2012 9 3590 10890
2012 10 1652 1652

注意:额外的月份是因为它是按周计算的,并且 9 月的第一周开始和最后一周结束与其他月份重叠。

根据我的手动计算,这是正确的,但 MonthlyForecastResult 对象没有这些值。生成的三个对象具有以下值:

年月基销售预测销售
2012 8 498 498
2012 9 9970 9970
2012 10 2717 2717

有谁知道是什么导致存储过程结果与复杂类型值不同?

4

0 回答 0