我正在尝试在SCCM中创建一个自定义报告,它会告诉我服务器池上是否安装了特定的KB,并返回二进制答案(在这种情况下,是或否)。
我遇到的问题是我无法让它返回只有一KB的状态。我正在运行这个:
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 :(得分: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
的不同列表返回到每个给定计算机的有问题更新的结果集。因此,当LEFT JOIN
返回的字段为NULL
时,更新尚未安装,反之亦然。
为了回答你的问题,我个人认为在查询中这样做是对的(而不是以某种方式在你的报告中) - 这就是我要做的事情。
答案 1 :(得分: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编号。这种方法可能不是一个完美的解决方案。
您可以尝试内置报告: \ Monitoring \ Overview \ Reporting \ Reports \ Software Updates - A Compliance \ 合规性8 - 处于特定合规状态的计算机进行更新(次要)