Clique no banner para conhecer e adquirir o meu treinamento de Bancos de Dados no Azure

SQL Server – Statement(s) could not be prepared. Case expressions may only be nested to level 10

Visualizações: 4.131 views
Tempo de Leitura: 3 minutos

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:

Msg 8180, Level 16, State 1, Line 1
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:

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!