Microsoft 将 Microsoft SQL Server 2008 R2 Service Pack 1 (SP1)作为一个可下载文件进行分发。 由于修补程序是累积的,因此每个新版本都包含以前的 SQL Server 2008 R2 Service Pack 1 (SP1)修复版本附带的所有修补程序和所有安全修补程序。
症状
请考虑以下情况:
-
在 Microsoft SQL Server 2008 R2 或 Microsoft SQL Server 2012 中的表中有一个 datetimeoffset 数据类型列。
-
在 datetimeoffset 列上创建索引。
-
通过使用CAST或convert函数而不使用style参数将datetimeoffset数据类型转换为smalldatetime数据类型,或者当style参数的值为0时。
-
CAST或CONVERT函数的结果在 transact-sql 查询的筛选器中使用。
-
运行 Transact-sql 查询。
在此方案中,查询返回的结果不正确,因为筛选器不能正常工作。 例如,假设名为 "Date" 的 datetimeoffset 列包含以下值:
-
2011-05-21 23:00:00 -01:00
-
2011-05-21 23:00:00 +00:00
-
2011-05-21 23:00:00 +01:00
您运行以下查询:
SELECT Date FROM TestTable WHERE CAST(Date AS smalldatetime)= '2011-05-21 23:00:00'
查询的结果仅返回一行。 但是,预期结果应返回所有三个值的行。
解决方案
累积更新信息
SQL Server 2012
此问题的修补程序首次在 SQL Server 2012 的累积更新3中发布。有关此累积更新包的详细信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
2723749 SQL Server 2012 累积更新包3注意 由于这些版本是累积的,因此每个新的修复版本都包含以前的 SQL Server 2012 修复版本附带的所有修补程序和所有安全修补程序。 Microsoft 建议你考虑应用包含此修补程序的最新修复版本。 有关更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
2692828 在 SQL Server 2012 发布后发布的 SQL Server 2012 版本 必须将 SQL Server 2012 修补程序应用到 SQL Server 2012 的安装。
SQL Server 2008 R2 Service Pack 2
此问题的修补程序首次在 SQL Server 2008 R2 Service Pack 2 的累积更新1中发布。有关如何获取此累积更新包的详细信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
2720425 SQL Server 2008 R2 Service Pack 2 的累积更新包1注意 由于这些版本是累积的,因此每个新的修复版本都包含了以前的 SQL Server 2008 R2 修补程序版本附带的所有修补程序和所有安全修补程序。 我们建议你考虑应用包含此修补程序的最新修复版本。 有关更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
2730301 发布 SQL Server 2008 R2 Service Pack 2 后发布的 SQL Server 2008 R2 版本
SQL Server 2008 R2 SP1
此问题的修补程序首次在累积更新7中发布。有关如何为 SQL Server 2008 R2 Service Pack 1 获取此累积更新包的详细信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
2703282 SQL Server 2008 R2 SP1 的累积更新包7注意 由于这些版本是累积的,因此每个新的修复版本都包含了以前的 SQL Server 2008 R2 Service Pack 1 修复版本附带的所有修补程序和所有安全修补程序。 我们建议你考虑应用包含此修补程序的最新修复版本。 有关更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
2567616 发布 SQL Server 2008 R2 SP1 后发布的 SQL Server 2008 R2 版本
更多信息
若要重现该问题,请按照下列步骤操作:
-
运行以下查询,以便创建带有 datetimeoffset 列的表并插入一些记录:CREATE TABLE #TestTimeZones (dto datetimeoffset(0)); GO INSERT INTO #TestTimeZones(dto) VALUES ('2011-05-21 23:00:00 -01:00'), ('2011-05-21 23:00:00 +00:00'), ('2011-05-21 23:00:00 +01:00'); GO
-
运行以下查询,你可以看到在返回的结果中正确列出了所有三个值:DECLARE @t smalldatetime = '2011-05-21 23:00:00' SELECT dto AS withoutIndex FROM #TestTimeZones WHERE CAST(dto AS smalldatetime)=@t;
-
运行以下查询,以便在 "dto" 列上创建索引并重复同一查询:CREATE INDEX IX_testTimeZones_Dto ON #TestTimeZones(dto); GO -- Repeat the same query DECLARE @t smalldatetime = '2011-05-21 23:00:00' SELECT dto AS withIndex FROM #TestTimeZones WHERE CAST(dto A smalldatetime)=@t; GO
-
再次在步骤2中运行查询。 这次,查询仅返回一行。
-
运行以下查询以删除索引和创建的表:DROP INDEX IX_testTimeZones_Dto ON #TestTimeZones; GO DROP TALBE #TestTimeZones; GO
参考
有关 CAST 和 CONVERT 函数的详细信息,请转到以下 MSDN 网站:
状态
Microsoft 已确认这是在“适用范围”部分中列出的 Microsoft 产品存在的问题。