Объединение многозначных параметров в SSRS - PullRequest
0 голосов
/ 04 мая 2020

У меня проблемы с получением правильного выполнения этого запроса. Он работает так, как будто я хочу его для одного значения, но если я выбираю несколько значений в своем отчете, он запускает запрос только для одного из них. Я хочу, чтобы запрос возвращал несколько значений для каждого имени сервера, которое есть в моем многозначном параметре @Servers.

Я изменил значение моего параметра, указав полное имя тегов, и изменил запрос, чтобы просто сказать IN (@Servers) без конкатенации, и это работает так, как я и ожидал, поэтому проблема заключается в конкатенации строк в выражении IN - просто не уверен, как мне нужно изменить это, чтобы он работал, перечисляя каждый тег из каждый сервер в моих значениях параметров будет за бортом для пользователя, чтобы выбрать их все.

SELECT tag, time, value
FROM piarchive..piplot
WHERE tag IN(
    @Servers+'_LogicalDisk(C:)_% Free Space',
    @Servers+'_LogicalDisk(E:)_% Free Space',
    @Servers+'_Memory_Available Mbytes',
    @Servers+'_Memory_Pages/sec',
    @Servers+'_Paging File(_Total)_% Usage',
    @Servers+'_Processor(_Total)_% Processor Time',
    @Servers+'_Ping'
)
AND intervalcount = 100
AND time BETWEEN FORMAT(CAST(@StartTime AS datetime), 'dd-MMM-yy HH:mm:ss') AND FORMAT(CAST(@EndTime AS datetime), 'dd-MMM-yy HH:mm:ss')
ORDER BY time

РЕДАКТИРОВАТЬ, чтобы добавить рабочее решение, которое я нашел, в дополнение к приведенному ниже:

SELECT tag, time, value
FROM piarchive..piplot
WHERE LEFT(tag,12) IN(@Servers) 
AND (tag like '%LogicalDisk(C:)_% Free Space'
    OR tag like '%LogicalDisk(E:)_% Free Space'
    OR tag like '%Memory_Available Mbytes'
    OR tag like '%Memory_Pages/sec'
    OR tag like '%Paging File(_Total)_% Usage'
    OR tag like '%Processor(_Total)_% Processor Time'
    OR tag like '%Ping'
)
AND intervalcount = 100
AND time BETWEEN FORMAT(CAST(@StartTime AS datetime), 'dd-MMM-yy HH:mm:ss') AND FORMAT(CAST(@EndTime AS datetime), 'dd-MMM-yy HH:mm:ss')
ORDER BY time

1 Ответ

0 голосов
/ 04 мая 2020

Если у вас нет столбца с изолированным именем сервера, вам может быть проще вычислить имя сервера, а затем протестировать этот столбец.

Вот пример. Это также будет работать с несколькими значениями из SSRS, вы просто не сможете протестировать его вне SSRS.

DECLARE @t TABLE (tag varchar(100))

INSERT INTO @t 
SELECT 'SrvA_Processor(_Total)_% Processor Time'
UNION SELECT 'SrvA_LogicalDisk(C:)_% Free Space'
UNION SELECT 'SrvA_LogicalDisk(E:)_% Free Space'
UNION SELECT 'SrvA_Memory_Available Mbytes'
UNION SELECT 'SrvA_Memory_Pages/sec'
UNION SELECT 'SrvA_Paging File(_Total)_% Usage'
UNION SELECT 'SrvA_Processor(_Total)_% Processor Time'
UNION SELECT 'SrvA_Ping'
UNION SELECT 'SrvB_Processor(_Total)_% Processor Time'
UNION SELECT 'SrvB_LogicalDisk(C:)_% Free Space'
UNION SELECT 'SrvB_LogicalDisk(E:)_% Free Space'
UNION SELECT 'SrvB_Memory_Available Mbytes'
UNION SELECT 'SrvB_Memory_Pages/sec'
UNION SELECT 'SrvB_Paging File(_Total)_% Usage'
UNION SELECT 'SrvB_Processor(_Total)_% Processor Time'
UNION SELECT 'SrvB_Ping'
UNION SELECT 'SrvC_Processor(_Total)_% Processor Time'
UNION SELECT 'SrvC_LogicalDisk(C:)_% Free Space'
UNION SELECT 'SrvC_LogicalDisk(E:)_% Free Space'
UNION SELECT 'SrvC_Memory_Available Mbytes'
UNION SELECT 'SrvC_Memory_Pages/sec'
UNION SELECT 'SrvC_Paging File(_Total)_% Usage'
UNION SELECT 'SrvC_Processor(_Total)_% Processor Time'
UNION SELECT 'SrvC_Ping'

DECLARE @Servers varchar(10) = 'SrvA'
SELECT * 
    FROM @t
    WHERE LEFT(tag,CHARINDEX('_',tag)-1) IN (@Servers)

Отредактируйте это, чтобы оно соответствовало вашим именам таблиц и столбцам, и это должно работать как есть в отчет, если ваш параметр является многозначным

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...