WQL не поддерживает TOP - требуется временное решение

WQL (в основном SQL для WMI) не поддерживает ключевые слова TOP или LIMIT. Сервер Sql использовал TOP и многие другие СУБД, поддерживающие LIMIT и т. Д.

Есть ли обходной путь для эмуляции запроса SELECT, чтобы он вел себя так, как если бы он имел предложение TOP / LIMIT, которое ограничивает набор результатов некоторым произвольным числом?

Или есть какое-то другое ключевое слово, специфичное для WQL, которое работает как TOP или LIMIT?


person Paul Sasik    schedule 15.10.2009    source источник
comment
Как вы собираетесь использовать ТОП? В большинстве случаев это вопрос использования сравнения значений MAX / MIN ...   -  person OMG Ponies    schedule 15.10.2009
comment
@rexem: Произвольно. В качестве примера предположим, что есть столбец с датой и временем, и вы хотите увидеть 10 самых последних событий. Есть ли способ использовать MIN / MAX для имитации TOP?   -  person Paul Sasik    schedule 15.10.2009


Ответы (3)


Нет, нет возможности смоделировать TOP, используя только WQL.

Исключение: если вам посчастливилось запрашивать класс WMI, у которого есть незаполненные возрастающие числовые номера экземпляров, используемые в качестве ключей, тогда вы можете использовать сравнения больше и меньше, чтобы ограничить и пролистать результаты.

Возможно, что ManagementClass.GetInstances () вместо использования запроса WQL может позволить вам отменить перечисление на полпути после того, как вы соберете достаточное количество экземпляров, и, следовательно, избежите оплаты ЦП и ОЗУ за одновременное перечисление всего списка.

Обратите внимание, что, AFAIK, поставщик CIMV2 WMI изначально не обрабатывает WQL - вместо этого он просто полагается на WMI для перечисления всех экземпляров, обработки WQL и фильтрации результатов перед их возвратом вызывающей стороне. Но дорогостоящая часть (фактически получение базовых данных WMI) все еще выполняется. Поэтому я считаю, что нет никакого повышения эффективности (для локальных запросов WMI), используя WQL по сравнению с использованием GetInstances () и самостоятельно фильтруя результаты - и если GetInstances () позволяет вам отменить на полпути, то GetInstances () может быть намного дешевле для длинных наборов результатов.

person Justin Grant    schedule 15.10.2009
comment
я нашел это: stackoverflow.com/questions/595123/ Есть ли шанс, что WQL поддерживает одну из этих ТОП-альтернатив синтаксиса из ответа? - person Paul Sasik; 16.10.2009
comment
Неа. WQL не поддерживает эту функцию. - person Justin Grant; 16.10.2009

соедините его с помощью "select xyz -First 1"

например: Get-WmiObject win32_logicaldisk | выберите -First 1

person user566047    schedule 06.01.2011
comment
Это самый бесполезный комментарий. Ваш WQL-запрос по-прежнему получает все объекты и сохраняет их в памяти, но на экране отображается только первый 1 (в вашем примере). Это не препятствует получению всех объектов. Фактически, если у вас был WQL-запрос, который возвращал 1000 объектов, и для каждого объекта требовалась 1 секунда, Select-Object -First 10 будет выводить 1 объект в секунду в течение первых 10 секунд, а затем команда будет выполняться еще 990 секунд без абсолютно никакой обратной связи с пользователь вообще! - person cogumel0; 01.10.2014
comment
Что ж, этот ответ был полезен для моей ситуации. Спасибо! - person afournier; 21.03.2018

Как сказал Джастин. Однако я не уверен в ваших точных требованиях. Я делал простой проект с Visual Basic, и часть его заключалась в том, чтобы получить журнал событий, просмотр списка не работает из-за огромного размера журнала приложений (> 20 МБ), и элемент управления входит в какой-то бесконечный цикл. Я хотел ограничить, вот псевдокод

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
person Sreejith. D. Menon    schedule 30.01.2012