Pergunta

WQL (basicamente SQL para WMI) não oferece suporte a palavras-chave TOP ou LIMIT.O Sql Server usou TOP e muitos outros RDBMSs que suportam LIMIT etc.

Existe uma solução alternativa para emular uma consulta SELECT para se comportar como se tivesse uma cláusula TOP/LIMIT que limita o conjunto de resultados a algum número arbitrário?

Ou existe alguma outra palavra-chave específica do WQL que funcione como TOP ou LIMIT?

Foi útil?

Solução

Não, não há como simular TOP usando apenas WQL.

Exceção:se você tiver a sorte de consultar uma classe WMI que possui números de instância numéricos ascendentes e sem lacunas usados ​​​​como chaves, poderá usar comparações maiores e menores para limitar e percorrer os resultados.

É possível que ManagementClass.GetInstances() em vez de usar uma consulta WQL, você pode cancelar a enumeração no meio do caminho depois de coletar instâncias suficientes e, portanto, evitar pagar o custo de CPU e RAM para enumerar a lista inteira de uma só vez.

Observe que, AFAIK, o provedor CIMV2 WMI não lida nativamente com WQL - em vez disso, ele simplesmente depende do WMI para enumerar todas as instâncias, processar o WQL e filtrar os resultados antes de retorná-los ao chamador.Mas a parte cara (na verdade, buscar os dados WMI subjacentes) ainda está concluída.Portanto, acredito que não há ganho de eficiência (isto é, para consultas WMI locais) usando WQL vs.usando GetInstances() e filtrando os resultados você mesmo - e se GetInstances() permitir cancelar no meio do caminho, então GetInstances() pode ser muito mais barato para conjuntos de resultados longos.

Outras dicas

Vá com "Selecione XYZ -First 1"

Por exemplo: Get -WmioBject Win32_LogicalDisk | Selecione -primeiro 1

Como Justin disse. Não tenho certeza sobre o seu requisito exato. Eu estava fazendo um projeto simples com o Visual Basic e parte dele era buscar o log de eventos, o ListView falha devido ao enorme tamanho do log de aplicativos (> 20 MB) e o controle entra em algum tipo de loop infinito. Eu queria limitar, então aqui está o pseudocódigo

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top