2009-10-15 32 views
4

WQL(基本上是WMI的SQL)不支持TOP或LIMIT關鍵字。 Sql Server使用TOP和許多其他RDBMSs支持LIMIT等。WQL不支持TOP - 需要解決方法

是否有解決方法來模擬SELECT查詢的行爲,就好像它有一個將結果集限制爲某個任意數的TOP/LIMIT子句?

或者還有其他一些WQL特定的關鍵字,像TOP或LIMIT一樣工作嗎?

+0

你打算如何使用TOP?大多數時候,這是使用MAX/MIN值比較的問題... – 2009-10-15 19:02:26

+0

@rexem:任意。舉例來說,假設有一個日期時間列,並且您想查看最近10次事件。有沒有使用MIN/MAX來模擬TOP的方法? – 2009-10-15 19:16:23

+0

MAX&rank/rownum ... – 2009-10-16 05:15:48

回答

4

不,不可以單獨使用WQL模擬TOP。

例外:如果您足夠幸運地查詢WMI類未使用的數字實例編號作爲鍵,那麼您可以使用大於或小於此值的比較來限制和翻頁結果。

可能ManagementClass.GetInstances()而不是使用WQL查詢可能允許您在收集足夠的實例時中途取消枚舉,從而避免支付一次列舉整個列表的CPU和RAM成本。

請注意,AFAIK,CIMV2 WMI提供程序本身不處理WQL--而只是依靠WMI來枚舉所有實例,處理WQL並在將結果返回給調用方之前過濾結果。但是昂貴的部分(實際上獲取底層WMI數據)仍然完成。所以我相信,通過使用WQL與使用GetInstances()並自己過濾結果,對於本地WMI查詢(即本地WMI查詢)沒有效率增益 - 如果GetInstances()允許您中途取消,則GetInstances()對於較長的結果集可能要便宜得多。

+0

我發現這個:http://stackoverflow.com/questions/595123/is-there-an-ansi-sql-alternative-to-the-mysql-limit-keyword 任何機會WQL支持從答案中選擇那些「TOP」語法替代方案之一? – 2009-10-15 20:10:12

+0

不是。 WQL不支持此功能。 – 2009-10-15 20:22:13

0

管將其與 「選擇XYZ - 第一1」

如:獲取WmiObject可以的Win32_LogicalDisk |選擇 - 第一1

+1

這是這裏最沒用的評論。您的WQL查詢仍會檢索所有對象並將其保存在內存中,但只有First 1(在您的示例中)顯示在屏幕上。這並不妨礙所有對象被檢索。事實上,如果您有一個返回1000個對象的WQL查詢,並且每個對象需要1秒,那麼一個'Select-Object -First 10'會在前10秒內每秒輸出1個對象,然後該命令會繼續執行另一個對象990秒,絕對沒有反饋給用戶! – cogumel0 2014-10-01 09:48:21

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 
相關問題