我用SQL创建了这个查询。效果很好。我证实了我得到的数据是准确的,也是我想要的。
SELECT
v_R_System.Name0,
v_MeteredUser.UserName,
v_R_User.Full_User_Name0,
User_Principal_Name0,
physicalDeliveryOfficeNam0,
v_GS_SoftwareFile.FileName,
v_GS_SoftwareFile.FileVersion,
MAX(v_MonthlyUsageSummary.LastUsage) as "LastUsedDate",
GETDATE() as "CurrentDate",
DATEDIFF(day,MAX(v_MonthlyUsageSummary.LastUsage),GETDATE())
FROM v_MeteredUser
INNER JOIN v_MonthlyUsageSummary ON v_MeteredUser.MeteredUserID = v_MonthlyUsageSummary.MeteredUserID
INNER JOIN v_GS_SoftwareFile ON v_MonthlyUsageSummary.FileID = v_GS_SoftwareFile.FileID
INNER JOIN v_R_System ON v_MeteredUser.UserName = v_R_System.User_Name0
INNER JOIN v_R_User ON v_MeteredUser.UserName= v_R_User.User_Name0
WHERE v_GS_SoftwareFile.FileName in ('extra.exe')
GROUP BY v_R_System.name0,
v_MeteredUser.UserName,
v_R_User.Full_User_Name0,
User_Principal_Name0,
physicalDeliveryOfficeNam0,
v_GS_SoftwareFile.FileName,
v_GS_SoftwareFile.FileVersion
HAVING (DATEDIFF(day, MAX(v_MonthlyUsageSummary.LastUsage), GETDATE()) >90)
ORDER BY v_R_System.Name0,
v_MeteredUser.UserName,
v_R_User.Full_User_Name0,
User_Principal_Name0,
physicalDeliveryOfficeNam0我想最终把这个翻译完,这样我就可以在SCCM中用我想要做90天移除的任何软件来填充一个集合。我开始逐行转换所有内容,确认名称,并确认SCCM中存在相同的项目。然后,我开始删除行,我很确定我不需要(还有一些我认为我可以删除)。经过一些尝试和错误之后,我来到了这里。
SELECT
SMS_R_System.Name,
SMS_MeteredUser.UserName,
SMS_R_User.FullUserName,
SMS_R_User.UserPrincipalName,
SMS_R_User.physicalDeliveryOfficeName,
SMS_G_System_SoftwareFile.FileName,
SMS_G_System_SoftwareFile.FileVersion
FROM SMS_MeteredUser
INNER JOIN SMS_MonthlyUsageSummary ON SMS_MeteredUser.MeteredUserID = SMS_MonthlyUsageSummary.MeteredUserID
INNER JOIN SMS_G_System_SoftwareFile ON SMS_MonthlyUsageSummary.FileID = SMS_G_System_SoftwareFile.FileID
INNER JOIN SMS_R_System ON SMS_MeteredUser.UserName = SMS_R_System.Name
INNER JOIN SMS_R_User ON SMS_MeteredUser.UserName = SMS_R_User.UserName
WHERE
SMS_G_System_SoftwareFile.FileName in ('extra.exe') AND
(DATEDIFF(day, SMS_MonthlyUsageSummary.LastUsage, GETDATE()) >90)
ORDER BY SMS_R_System.Name集合没有填充,所以我打开查询尝试一些东西,得到一个错误,这将解释为什么它没有填充。我得到的错误是:
指定的资源类与当前集合类型不匹配。
我不能百分之百肯定我做错了什么。我有一个类似的查询,运行良好。
发布于 2021-07-21 11:55:21
这里有几个因素起作用(比如WQL只支持SQL特性的一个子集,或者不是所有名称甚至列都直接翻译),但我认为这里最重要的是基于查询的集合不能对任何查询结果进行操作。
这样做的好处似乎是,您甚至不必注意您的结果可以识别为设备列表。您可以从v_r_system中只选择一个矛盾的列,而且它仍然可以工作(实际上,在保存之后,您会注意到查询被自动修改以包括ResourceID)。如果结果有一个记录的多个列,SCCM填充集合也没有问题。
缺点是你不能仅仅通过你自己的设计来“保证”你产生的是一个有效的列表。为了让它填充一个集合,您必须遵循一些指导原则。现在,我不太确定什么是可能的,也不知道是否存在异常,但从我通过试验发现的结果来看,最好的方法是始终以SMS_R_SYSTEM作为设备集合的基类(用户集合的SMS_R_USER )。如果将其余的加入到该类,SCCM将始终能够填充您的集合。
因此,考虑到这一点,我将重新排列选择,这不应成为内部联接的问题(我希望我对SQL的有限知识不会背叛我),因此它将成为:
SELECT
SMS_R_SYSTEM.ResourceID,
SMS_R_SYSTEM.Name,
SMS_MeteredUser.UserName,
SMS_R_User.FullUserName,
SMS_R_User.UserPrincipalName,
SMS_G_System_SoftwareFile.FileName,
SMS_G_System_SoftwareFile.FileVersion
FROM SMS_R_System
INNER JOIN SMS_MeteredUser ON SMS_MeteredUser.UserName = SMS_R_System.LastLogonUserName
INNER JOIN SMS_MonthlyUsageSummary ON SMS_MeteredUser.MeteredUserID = SMS_MonthlyUsageSummary.MeteredUserID
INNER JOIN SMS_G_System_SoftwareFile ON SMS_MonthlyUsageSummary.FileID = SMS_G_System_SoftwareFile.FileID
INNER JOIN SMS_R_User ON SMS_MeteredUser.UserName = SMS_R_User.UserName
WHERE
SMS_G_System_SoftwareFile.FileName in ('extra.exe') AND
(DATEDIFF(day, SMS_MonthlyUsageSummary.LastUsage, GETDATE()) >90)它作为一个查询来填充我的集合很好。注意,我不得不删除'physicalDeliveryOfficeName‘,因为它在我的系统中不存在,但实际上您可以删除任何属性,因为查询无论如何都不关心它们(而且这种查询也只能在“直接查询编辑”中工作,而在查询设计器中永远不会起作用。
通常,我会说,虽然您正确地注意到从SQL到WQL的直接转换是不可能的,但我仍然认为这是一个很好的起点,只要您记住可能的失败,因为一个巨大的好处就是速度。在您的示例中,我尝试了通过WQL进行一些调试,在我的环境中,大多数类甚至不能在不限定某些参数的情况下被查询,因为这需要几分钟时间和超时时间。在SQL中,花费最多的时间是15秒,这使得对输出的检查更加方便。
https://stackoverflow.com/questions/68309576
复制相似问题