2016-12-29 8 views
0

Я пытаюсь создать собственный отчет в SCCM, который скажет мне, установлен ли конкретный КБ в пуле серверов и возвращает двоичный ответ (в этом случае да или нет).Отчет SCCM для возврата статуса КБ на серверы

Проблема у меня есть, я не могу заставить ее вернуть статус только одного КБ. Я бегу это:

SELECT 
SYS.Name0 'Computer', 
SYS.operatingSystem0 'OS', 
UIN.Title 'Update', 
CASE 
    WHEN UIN.Title LIKE '%KB3092627%' THEN 'Yes' 
    ELSE 'No' 
    END 'KB Installed' 

FROM v_R_System SYS 
INNER JOIN v_UpdateComplianceStatus UCS ON SYS.ResourceID = UCS.ResourceID 
INNER JOIN v_UpdateInfo UIN ON UCS.CI_ID = UIN.CI_ID 

WHERE SYS.operatingSystem0 LIKE '%Server 2008%' 

ORDER BY SYS.Name0 

, но я получаю сотни результатов для каждого SYS.Name0, по одному для каждого обнаруженного обновления. Все записи для обновлений, которые имеют желаемый КБ, имеют значение 'No' для KB Installed, но они все еще перечислены. Я попробовал SELECT DISTINCT, чтобы узнать, получились ли у меня разные результаты, но это не так.

Я хочу, чтобы определить, присутствует ли KB, и вернуться, если это так. Я чувствую, что даже не задаю основополагающий вопрос «Установлен или нет» с этим кодом, но я не могу придумать способ задать это по-другому. Это что-то, что я должен делать в построителе отчетов вместо запроса?

ответ

0

Отказ от ответственности: я не проверял это на репрезентативных данных, установленных как вы не предоставили один, но я думаю, что это должен делать то, что вы пытаетесь достичь:

SELECT DISTINCT 
    s1.Name0 'Computer', 
    s1.operatingSystem0 'OS', 
    CASE WHEN matches.Computer IS NULL THEN 'No' ELSE 'Yes' END 'KB Installed' 
FROM v_R_System s1 
LEFT JOIN 
(
    SELECT s2.Name0 'Computer', 
    FROM v_R_System s2 
    INNER JOIN v_UpdateComplianceStatus UCS ON s2.ResourceID = UCS.ResourceID 
    INNER JOIN v_UpdateInfo UIN ON UCS.CI_ID = UIN.CI_ID 
    WHERE UIN.Title LIKE '%KB3092627%' 
) AS matches ON s1.Name0 = matches.Computer 
WHERE s1.operatingSystem0 LIKE '%Server 2008%' 
ORDER BY s1.Name0 

Так это эффективно возвращает отдельный список всех компьютеров и LEFT JOIN s это результат набора только записей для соответствующего обновления для каждого данного компьютера. Поэтому, когда поле, возвращаемое с LEFT JOIN, равно NULL, обновление не установлено и наоборот.

И, чтобы ответить на ваш вопрос, я лично считаю, что это нормально делать в запросе (в отличие от вашего отчета) - именно там я и сделаю это.

+0

Это делает это, спасибо вам большое! Я был совершенно застопорился по этому вопросу. – Eric

+0

Использует ли значение SELECT DISTINCT в сравнении с SELECT в этом случае? Как это изменит результат в операторе CASE или что-то еще? – Eric

+0

Это означает, что каждое значение 's1.Name0' появляется только один раз (где в действительности каждое значение может появляться много раз в таблице' v_R_System'), что и есть то, что вы хотите. Попробуйте удалить «DISTINCT» из вашего запроса и посмотреть, какие результаты вы получите. :) – 3N1GM4

0

Пожалуйста, запустите этот запрос ниже:

SELECT DISTINCT 
 
SYS.Name0 'Computer', 
 
SYS.Operating_System_Name_and0 'OS', 
 
UIN.Title 'Update', 
 
CASE 
 
    WHEN UIN.Title LIKE '%KB3079343%' THEN 'Yes' 
 
    ELSE 'No' 
 
    END 'KB Installed' 
 

 
FROM v_R_System SYS 
 
left JOIN v_UpdateComplianceStatus UCS ON SYS.ResourceID = UCS.ResourceID 
 
left JOIN v_UpdateInfo UIN ON UCS.CI_ID = UIN.CI_ID 
 

 
WHERE UIN.Title LIKE '%KB3079343%' 
 

 

 
ORDER BY SYS.Name0

В моей тестовой лаборатории, Есть несколько записей, соответствующих одному KB номер. Этот метод может быть не идеальным решением. enter image description here

Вы можете попробовать встроенный в докладе: \ Monitoring \ Обзор \ Отчеты \ Отчеты \ Обновления программного обеспечения - по соблюдению \ Compliance 8 - Компьютеры в определенном состоянии соответствия для обновления (вторичный)