¡Hola, chicos!
En este artículo me gustaría compartir con ustedes una pregunta que fue enviada en un grupo de Whatsapp, la cual estaba relacionada con el siguiente mensaje de error cuando un analista intentaba crear un CASO con más de 10 condiciones en un SELECT:
No se pudieron preparar las declaraciones.
Mensaje 125, Nivel 15, Estado 4, Línea 1
Las expresiones de casos sólo se pueden anidar en el nivel 10.
Comprender y simular el problema.
La consulta en cuestión era algo como esto:
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
Entonces, intentaré reproducir este escenario en mi entorno de prueba:

Analizando el plan de ejecución estimado (el real no abre), identificamos que SQL Server está utilizando el operador “Remote Query” para realizar la consulta y esto se cambió incluyendo varios casos anidados, como se muestra en el siguiente cuadro:

OK... Logré simular el error... Voy a conectarme a la instancia de la fuente de datos para probar si esta consulta funcionará localmente o si esto solo sucede cuando los datos provienen de un servidor vinculado:

La misma consulta funcionó cuando me conecté a la instancia local, incluso con más de 10 condiciones en el CASE. En otras palabras, acabo de confirmar que este mensaje de error solo aparece cuando aplicamos un caso basado en datos que provienen de un servidor vinculado. Consultando datos locales, es decir datos que están en la misma instancia, no tenemos esta restricción, ya que en esta ocasión, el operador utilizado es Clustered Index Scan en lugar de Remote Query:

Busquemos algunas alternativas para aplicar este CASO y evitar este mensaje de error:
Usando subconsulta
Intenté usar una subconsulta para intentar ignorar esta limitación de más de 10 condiciones en un caso con datos provenientes de un servidor vinculado.

Usando CTE
Intenté utilizar un CTE para intentar ignorar esta limitación de más de 10 condiciones en un caso con datos provenientes de un servidor vinculado.

Usando múltiples CASOS con COALESCE
Cuando intenté usar varios casos y una función COALESCE para unir los datos de varios casos en una sola columna, ahí fue donde logré realizar la consulta:

Usando OPENQUERY
Cuando intenté usar OPENQUERY para consultar los datos remotos y ensamblar el CASE, también logré realizar la consulta:

Resumen de la publicación:
- Si la consulta no utiliza Linked Server, no es necesario utilizar esta técnica. Puedes utilizar tantas condiciones como quieras en un mismo caso.
- Si la consulta utiliza un servidor vinculado que apunta a la propia instancia, tampoco es necesario utilizar esta técnica. Funciona como si fuera una consulta normal sin servidor vinculado.
- La función COALESCE acepta múltiples condiciones, por lo que no se limita a sólo 2 casos, pueden ser varios (aunque la complejidad del código aumenta...)
- Sólo se pueden utilizar hasta 9 condiciones en cada CASO en escenarios donde la consulta se realiza sobre datos remotos
- El uso de ELSE NULL al final de cada caso es opcional
- Subconsulta y CTE no resuelven este problema
- OPENQUERY y OPENROWSET tampoco tienen esta limitación de 10 condiciones CASE
Gracias por visitarnos, espero que hayas disfrutado de la publicación tan objetiva y ¡hasta luego!
¡Gran abrazo!
Comentários (0)
Carregando comentários…