这个查询(或者更确切地说,一个类似于它)是在我们已经部署了一个代码库。
var timeblocks = from tb in DB.TimeBlocks
where tb.StartDate.Date.AddDays(1) <= DateTime.Today
select tb.Id;
DB是连接到数据库的DataContext的。 TimeBlocks是一个相当简单的表格,起始日期是DateTime列。
目前,该数据库托管在一个SQL Server 2005安装,但我们在升级到SQL Server 2008的安装过程。
查询目前exectutes没有问题。
如果我们改变了连接字符串在SQL Server 2008中(与2005年成立的兼容性级别)查询失败与SQLEXCEPTION上运行同一数据库的副本点:
“日期部分毫秒不受DATEADD用于数据类型日期日期功能的支持。”
这似乎是因为当它连接到2008分贝通过发出的LINQ到SQL不同的SQL(我想这是因为它使用Sql2008Provider代替Sql2005Provider的)。
2005年供应商产生良好的SQL:
SELECT [t0].[Id]
FROM [dbo].[TimeBlock] AS [t0]
WHERE DATEADD(ms, (CONVERT(BigInt,@p0 * 86400000)) % 86400000, DATEADD(day, (CONVERT(BigInt,@p0 * 86400000)) /
86400000, DATEADD(HOUR, -DATEPART(HOUR, [t0].[StartDate]), DATEADD(MINUTE, -DATEPART(MINUTE,
[t0].[StartDate]), DATEADD(SECOND, -DATEPART(SECOND, [t0].[StartDate]), DATEADD(MILLISECOND,
-DATEPART(MILLISECOND, [t0].[StartDate]), [t0].[StartDate])))))) <= @p1
它成功地执行查询。 然而由Sql2008Provider发出的SQL:
SELECT [t0].[Id]
FROM [dbo].[TimeBlock] AS [t0]
WHERE DATEADD(ms, (CONVERT(BigInt,@p0 * 86400000)) % 86400000, DATEADD(day, (CONVERT(BigInt,@p0 * 86400000)) /
86400000, CONVERT(DATE, [t0].[StartDate]))) <= @p1
包含导致异常错误的SQL。
我是正确的思维是,它是导致此问题的SQL提供?
有没有一种方法,我们可以通过强制的DataContext使用Sql2005Provider这个分贝克服这个问题?
感谢您的帮助,您可以给我们!