我有一个存储过程来计算给定日期的预测销售数据。
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
运行良好并产生我期望的值。我在Entity Framework设计器中创建了一个函数import,它应该将这些结果作为复杂类型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中运行它,我会返回三行:
Year Month BaseSales ForecastSales 2012 8 660 660 2012 9 3590 10890 2012 10 1652 1652
注意:额外的月份是因为它是根据周计算的,第一周的开始和9月的最后一周的结束与其他月份重叠。
根据我的手动计算,这是正确的,但MonthlyForecastResult对象没有这些值。生成的三个对象改为使用这些值:
Year Month BaseSales ForecastSales 2012 8 498 498 2012 9 9970 9970 2012 10 2717 2717
有没有人知道是什么原因导致存储过程结果与复杂类型值不同?