WQL不支持TOP - 需要解决方法

时间:2009-10-15 18:57:48

标签: sql wmi wmi-query wql

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

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

或者是否存在其他一些特定于WQL的关键字,其效果类似于TOP或LIMIT?

3 个答案:

答案 0 :(得分:4)

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

例外:如果你很幸运能够查询一个没有空位的WMI类,用作键的升序数字实例数,那么你可以使用大于等于或小于那时的比较来限制和翻译结果。

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

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

答案 1 :(得分:1)

使用“select xyz -First 1”

来管道它

例如:Get-WmiObject win32_logicaldisk | select -First 1

答案 2 :(得分:1)

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

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