Ошибка SQL Server Вложенный запрос вернул больше одного значения

MS SQL 2008

В MS SQL 2008 вкралась досадная ошибка, приводящая к заполнению журнала сообщениями вида "Ошибка SQLServer: 512, Вложенный запрос вернул больше одного значения. Это запрещено, когда вложенный запрос следует после =, !=, <, <=, >, >= или используется в качестве выражения. [SQLSTATE 21000]" или в английской версии "Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression." Проаналировав выполняемые задачи, мы поняли, что дело тут не в пользовательских запросах, виной всему системная база msdn, а точнее запрос в хранимой процедуре msdb.dbo.sp_sqlagent_get_perf_counters.

Error 512
Для решения проблемы необходимо заменить запросы вида

(SELECT CASE spi2.cntr_value WHEN 0 THEN 1 ELSE spi2.cntr_value END

FROM sys.dm_os_performance_counters spi2

WHERE  (RTRIM(spi1.counter_name) + ' ' = SUBSTRING(spi2.counter_name, 1, PATINDEX('% base%', LOWER(spi2.counter_name))))

AND (spi1.instance_name = spi2.instance_name)

AND (spi2.cntr_type = @perfTypeRawBase))

на

(SELECT CASE spi2.cntr_value WHEN 0 THEN 1 ELSE spi2.cntr_value END

FROM sys.dm_os_performance_counters spi2

WHERE (spi1.[object_name] = spi2.[object_name])

AND (RTRIM(spi1.counter_name) + ' ' = SUBSTRING(spi2.counter_name, 1, PATINDEX('% base%', LOWER(spi2.counter_name))))

AND (spi1.instance_name = spi2.instance_name)

AND (spi2.cntr_type = @perfTypeRawBase))

т.е. добавить условие  (spi1.[object_name] = spi2.[object_name])
Встречается оно в четырех запросах. После исправления ошибка исчезнет. Microsoft утверждает, что проблему можно решить применив KB 2591748 Cumulative update package 3 for SQL Server 2008 R2 SP1, но исправление хранимой процедуры быстрее и элегантнее. Странно, что именитый производитель допускает подобные ошибки, да еще и где, в системной базе MSDB.
 

Tags: