【问题标题】:WQL does not support TOP - need workaroundWQL 不支持 TOP - 需要解决方法
【发布时间】:2010-12-07 03:45:21
【问题描述】:

WQL(基本上是用于 WMI 的 SQL)不支持 TOP 或 LIMIT 关键字。 Sql Server 使用 TOP 和许多其他 RDBMS 支持 LIMIT 等。

是否有一种解决方法可以模拟 SELECT 查询,使其表现得好像它有一个 TOP/LIMIT 子句,将结果集限制为某个任意数字?

或者是否有其他一些 WQL 特定的关键字,如 TOP 或 LIMIT?

【问题讨论】:

  • 您打算如何使用 TOP?大多数时候,这是使用 MAX/MIN 值比较的问题......
  • @rexem:随意。举例来说,假设有一个日期时间列,并且您想查看最近的 10 个事件。有没有办法使用 MIN/MAX 来模拟 TOP?

标签: sql wmi wmi-query wql


【解决方案1】:

不,没有办法单独使用 WQL 来模拟 TOP。

例外情况:如果您有幸查询了一个 WMI 类,该类具有未锁定的、升序的数字实例编号用作键,那么您可以使用大于和小于比较来限制和翻阅结果。

ManagementClass.GetInstances() 可能允许您在收集到足够的实例后中途取消枚举,而不是使用 WQL 查询,从而避免一次性枚举整个列表的 CPU 和 RAM 成本。

请注意,AFAIK,CIMV2 WMI 提供程序本身并不处理 WQL,而是仅依靠 WMI 枚举所有实例、处理 WQL,并在将结果返回给调用者之前对其进行过滤。但昂贵的部分(实际上是获取底层 WMI 数据)仍然完成。因此,我相信通过使用 WQL 与使用 GetInstances() 并自己过滤结果并没有提高效率(对于本地 WMI 查询)——如果 GetInstances() 允许您中途取消,那么 GetInstances()对于长结果集可能要便宜得多。

【讨论】:

【解决方案2】:

就像贾斯汀所说的那样。不过,我不确定您的确切要求。我正在用 Visual Basic 做一个简单的项目,其中一部分是获取事件日志,由于应用程序日志(> 20MB)的巨大大小,列表视图失败,并且控件进入某种无限循环。我想限制所以这里是伪代码

topval = UserInputText.Text 'Assuming user entered the top 10 or 20

while ThereAreStillItemsInCollection
 if topval = 0 then
 goto CleanUpMemObjectsAndReturn
 end if
topval = topval  - 1
wend
CleanUpMemObjectsAndReturn:
set obj = Nothing
end sub

【讨论】:

    【解决方案3】:

    用“select xyz -First 1”管道它

    如:Get-WmiObject win32_logicaldisk |select -First 1

    【讨论】:

    • 这是这里最没用的评论。您的 WQL 查询仍然检索所有对象并将其保存在内存中,但只有前 1 个(在您的示例中)显示在屏幕上。这不会阻止检索所有对象。事实上,如果您有一个返回 1000 个对象的 WQL 查询并且每个对象需要 1 秒,那么 Select-Object -First 10 将在前 10 秒内每秒输出 1 个对象,然后该命令将继续运行另外 990 秒,绝对没有反馈给用户!
    • 嗯,这个答案对我的情况很有用。谢谢!
    猜你喜欢
    • 2016-06-05
    • 1970-01-01
    • 2020-10-02
    • 2023-02-20
    • 2023-02-07
    • 2014-12-13
    • 2020-05-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多