Fala pessoal!
Nesse artigo eu gostaria de compartilhar com vocĂªs uma dĂºvida que foi enviada em um grupo de Whatsapp, que era referente Ă mensagem de erro abaixo quando um analista estava tentando montar um CASE com mais de 10 condições num SELECT:
Statement(s) could not be prepared.
Msg 125, Level 15, State 4, Line 1
Case expressions may only be nested to level 10.
Entendendo e simulando o problema
A consulta em questĂ£o era algo tipo isso:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
SELECT (CASE Id WHEN 1 THEN 1 WHEN 2 THEN 2 WHEN 3 THEN 3 WHEN 4 THEN 4 WHEN 5 THEN 5 WHEN 6 THEN 6 WHEN 7 THEN 7 WHEN 8 THEN 8 WHEN 9 THEN 9 WHEN 10 THEN 10 WHEN 11 THEN 11 END) AS Teste FROM [DIRCEU-VM\SQL2019].dirceuresende.dbo.Clientes |
EntĂ£o, vou tentar reproduzir esse cenĂ¡rio no meu ambiente de testes:
Analisando o plano de execuĂ§Ă£o estimado (o real nĂ£o abre), identificamos que o SQL Server estĂ¡ utilizando o operador “Remote Query” para fazer a consulta e esta foi alterada incluindo vĂ¡rios cases aninhados, conforme o print abaixo:
OK.. consegui simular o erro.. Vou conectar na instĂ¢ncia da origem dos dados para testar se essa query vai funcionar local ou se sĂ³ acontece isso quando os dados vĂªm de Linked Server:
A mesma consulta funcionou quando conectei na instĂ¢ncia local, mesmo com mais de 10 condições no CASE. Ou seja, acabei de comprovar que essa mensagem de erro sĂ³ acontece quando estamos aplicando um case a partir de dados que vĂªm de um Linked Server. Consultando dados locais, ou seja, que estĂ£o na mesma instĂ¢ncia, nĂ£o temos essa restriĂ§Ă£o, uma vez que desta vez, o operador utilizado Ă© o Clustered Index Scan ao invĂ©s do Remote Query:
Vamos buscar algumas alternativas para aplicar esse CASE e evitar essa mensagem de erro:
Utilizando subquery
Tentei utilizar uma subquery para tentar ignorar essa limitaĂ§Ă£o de mais de 10 condições num case com dados vindo de Linked Server.
Utilizando CTE
Tentei utilizar uma CTE para tentar ignorar essa limitaĂ§Ă£o de mais de 10 condições num case com dados vindo de Linked Server.
Utilizando MĂºltiplos CASES com COALESCE
Quando tentei utilizar mĂºltiplos cases e uma funĂ§Ă£o COALESCE para juntar os dados dos mĂºltiplos cases em uma Ăºnica coluna, foi onde consegui sucesso para realizar a consulta:
Utilizando OPENQUERY
Quando tentei utilizar OPENQUERY para consultar os dados remotos e montar o CASE, também tive sucesso para realizar a consulta:
Resumo do post:
- Se a consulta nĂ£o utilizar Linked Server, nĂ£o precisa utilizar essa tĂ©cnica. Pode utilizar quantas condições quiser no mesmo case
- Se a consulta utilizar Linked Server que aponte para a prĂ³pria instĂ¢ncia, nĂ£o precisa utilizar essa tĂ©cnica tambĂ©m. Funciona como se fosse uma consulta normal sem linked server.
- A funĂ§Ă£o COALESCE aceita mĂºltiplas condições, entĂ£o nĂ£o Ă© limitada a somente 2 cases, podem ser vĂ¡rios (embora a complexidade do cĂ³digo vĂ¡ aumentando..)
- VocĂª sĂ³ pode utilizar atĂ© 9 condições em cada CASE em cenĂ¡rios onde a consulta Ă© feita em dados remotos
- A utilizaĂ§Ă£o do ELSE NULL ao final de cada case Ă© opcional
- Subquery e CTE nĂ£o resolvem esse problema
- OPENQUERY e OPENROWSET nĂ£o possuem essa limitaĂ§Ă£o de 10 condições do CASE tambĂ©m
Obrigado pela visita, espero que tenham gostado do post bem objetivo e até mais!
Grande abraço!