5

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

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

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

4

3 回答 3

4

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

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

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

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

于 2009-10-15T19:23:10.177 回答
1

用“select xyz -First 1”管道它

eg: Get-WmiObject win32_logicaldisk |select -First 1

于 2011-01-06T20:49:43.333 回答
1

正如贾斯汀所说。不过,我不确定您的确切要求。我正在使用 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
于 2012-01-30T07:33:20.107 回答