В 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.
Для решения проблемы необходимо заменить запросы вида
(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.