Microsoft 将 Microsoft SQL Server 2008 R2 Service Pack 1 (SP1)作为一个可下载文件进行分发。 由于修补程序是累积的,因此每个新版本都包含以前的 SQL Server 2008 R2 Service Pack 1 (SP1)更新版本附带的所有修补程序和所有安全更新。
症状
当 Microsoft SQL Server 2008 R2 中引发 SQL Server 性能条件警报时,你可能会收到以下错误消息:
消息512、级别16、状态1、过程 sp_sqlagent_get_perf_counters、行40Subquery 返回的值多于1。 当子查询跟随在 =、! =、<、<=、>、>= 或子查询用作表达式时,则不允许此操作。
此外,在这种情况下,将在 SQL Server 代理错误日志中记录该错误消息。注意 此问题也会在 Microsoft SQL Server 2008 中发生。
原因
出现此问题的原因是 msdb.dbo.sp_sqlagent_get_perf_counters system 存储过程的子查询错误地计算计数器的值。 子查询在子查询的条件中缺少 [object_name] 列的内部联接关系。 因此,错误地返回多行,并且出现 "症状" 部分中提及的问题。注意 Msdb.dbo.sp_sqlagent_get_perf_counters系统存储过程在引发 SQL Server 性能条件警报时运行。
解决方案
累积更新信息
SQL Server 2008 R2 SP1 的累积更新包3
此问题的修补程序首次发布于累积更新程序包3。有关如何获取此累积更新包的 SQL Server 2008 R2 SP1 的详细信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
2591748 SQL Server 2008 R2 SP1 的累积更新包3注意 由于这些版本是累积的,因此每个新的更新版本都包含以前的 SQL Server 2008 R2 SP1 更新版本附带的所有修补程序和所有安全更新。 我们建议你考虑应用包含此修补程序的最新更新版本。 有关更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
2567616 发布 SQL Server 2008 R2 SP1 后发布的 SQL Server 2008 R2 版本
解决方法
若要解决此问题,请更新 msdb.dbo.sp_sqlagent_get_perf_counters 系统存储过程的子查询。 若要执行此操作,请将以下条件添加到在[value]列计算中使用的四个子查询的WHERE子句中:
(spi1.[object_name] = spi2.[object_name])
添加条件后,子查询类似于以下内容:
SELECT CASE spi2.cntr_value WHEN 0 THEN 1 ELSE spi2.cntr_value ENDFROM sys.dm_os_performance_counters spi2WHERE (spi1.[object_name] = spi2.[object_name])AND (spi1.counter_name + ' ' = SUBSTRING(spi2.counter_name, 1, PATINDEX('% Base%', spi2.counter_name)))AND (spi1.instance_name = spi2.instance_name)AND (spi2.cntr_type = @perfTypeLargeRawBase
状态
Microsoft 已确认这是在“适用范围”部分中列出的 Microsoft 产品存在的问题。