SQLShack (Español)
Los cursores de SQL Server son un tema común en Internet . Encontrarás diferentes opiniones sobre cuándo usarlas y cuándo no hacerlo. Hoy también hablaremos sobre ellos y responderemos la pregunta de cuándo (no) usarlos.
El modelo de datos y la idea general
En el artículo anterior, Introducción a SQL Bucles de servidor, hablamos de bucles de SQL Server, pero no hemos utilizado datos de la base de datos. Eso era extraño, pero debería quedar mucho más claro ahora. Hoy, mientras explicamos los cursores, usaremos los datos de la base de datos para mostrar cuándo (no) usar los cursores. El modelo de datos que usaremos es el mismo que usamos en esta serie.
SQL Server admite 3 diferentes implementaciones de cursores: cursores Transact-SQL, cursores API y cursores cliente. En este artículo, nos centraremos en los cursores Transact-SQL. Los reconocerá fácilmente porque se basan en la sintaxis DECLARE CURSOR.
Cursor de SQL Server – Introducción
Antes de pasar al código y los ejemplos, deberíamos explicar qué cursores de SQL Server son.
El cursor de SQL Server es lógica T-SQL, que nos permite recorrer el resultado de la consulta relacionada. Esto nos permite tomar las acciones de forma secuencial, por ejemplo, realizar una actualización en una sola fila.
A veces, esto podría (parecer) ser útil, pero cuando se trabaja con bases de datos, no debe utilizar patrones de programación de procedimientos. sino que se adhiera a la programación declarativa. Una de las principales razones es que los DBMS ya están optimizados para realizar acciones en conjuntos de datos y, por lo tanto, usted no debería ser el que intente ser «más inteligente que el sistema».
Aún así, es bueno para saber cómo funcionan. Al menos, tal vez los encuentres en el código que heredes y tendrás que reescribir la lógica. Y antes de hacer nada, debes entender cómo funciona.
Entonces, en caso de que necesite cursores, esto es lo que debe saber sobre ellos:
- Los cursores usan variables para almacenar valores devueltos en cada parte del ciclo. Por lo tanto, deberá DECLARAR todas las variables que necesitará
- Lo siguiente que debe hacer es DECLARAR … CURSOR PARA SELECCIONAR la consulta, donde declarará un cursor y también definirá la consulta relacionada con (rellenar) ese cursor
- ABRIRÁ el cursor y BUSCARÁ SIGUIENTE desde el cursor
- En el ciclo WHILE, probará la variable @@ FETCH_STATUS (WHILE @@ FETCH_STATUS = 0). Si la condición se cumple, Entraré en el bucle BEGIN … END bloquear y ejecutar declaraciones dentro de ese bloque
- Después de recorrer todo el conjunto de resultados, saldrá del ciclo. Debes CERRAR el cursor y DESALOJARLO. La desasignación es importante porque eliminará la definición del cursor y liberará la memoria utilizada
Cursor de SQL Server – Ejemplos
Veamos ahora dos ejemplos de cursor. Si bien son bastante simples, explican muy bien cómo funcionan los cursores.
En el primer ejemplo, queremos obtener todos los identificadores y nombres de ciudades, junto con los nombres de los países relacionados. Usaremos el comando PRINT para imprimir combinaciones en cada pasada del ciclo.
Usando el cursor de SQL Server y el while loop devolvió exactamente lo que esperábamos: identificadores y nombres de todas las ciudades y países relacionados que tenemos en la base de datos.
Lo más importante a mencionar aquí es que simplemente podríamos devolver este conjunto de resultados utilizando la consulta SQL original almacenada en la parte DECLARE del cursor, por lo que no había necesidad de un cursor.
Vamos con un ejemplo más. Esta vez, consultaremos la base de datos del esquema de información para devolver las primeras 5 tablas ordenadas por nombre de tabla. Si bien no tiene mucho sentido usar una consulta de este tipo, este ejemplo le muestra:
- Cómo consultar la base de datos del esquema de información
- Cómo combinar algunos comandos / declaraciones que que mencioné en artículos anteriores (IF … ELSE, WHILE loop, CONCAT)
Desde el lado de la codificación, Me gustaría enfatizar que esta vez, no hemos impreso nada en un bucle, sino que hemos creado una cadena usando CONCAT. Además, hemos usado la instrucción IF para probar si estamos en la primera pasada, y si es así, no hemos agregado «,». De lo contrario, agregaríamos «,» a la cadena.
Después del ciclo, imprimimos la cadena de resultado, cerramos y desasignamos el cursor.
Podríamos lograr esto usando la función STRING_AGG. Este está disponible a partir de SQL Server 2017 y es el equivalente a la función GROUP_CONCAT de MySQL.
Cursor de SQL Server – ¿Cuándo (no) usarlos?
Intentaré dar una respuesta objetiva a la pregunta: «¿Cuándo se deben usar los cursores de SQL Server y cuándo no»? Dado que las cosas cambian con el tiempo y se harán mejoras, ya sea en los cursores, ya sea en otros objetos que los «reemplacen», tenga en cuenta la fecha en que se escribió este artículo.Entonces, comencemos.
No debe usar cursores:
- Casi siempre 🙂 Esto puede sonar estúpido, pero es cierto en la mayoría de los casos. SQL Server implementa una gran cantidad de objetos & funciones que hacen exactamente lo que probablemente trataría de resolver usando cursores. Antes de decidir usar el cursor, asegúrese de haber investigado lo suficiente como para concluir que el cursor es la única solución posible (buena). Lo mismo significa bucles en bases de datos. En el artículo anterior, Introducción a los bucles de SQL Server, hemos utilizado bucles, pero no para recorrer los datos.
Puede usar cursores:
- Principalmente para tareas de administración de bases de datos como copias de seguridad, verificaciones de integridad, reconstrucción de índices
- Por única vez tareas cuando esté seguro de que un posible rendimiento deficiente no afectará el rendimiento general del sistema.
-
Llamar a un procedimiento almacenado varias veces utilizando diferentes parámetros. En ese caso, obtendría parámetros de las variables del cursor y realizaría llamadas dentro del bucle
Llamar a un procedimiento almacenado u otra consulta dentro del cursor (o bucle) impacta mucho en el rendimiento, porque, en cada paso del bucle de cursor, ejecutará la consulta / procedimiento desde el principio. Si decide hacer eso, debe tener en cuenta las posibles consecuencias.
- La sugerencia anterior nos lleva a la última viñeta en la que debe usar cursores. Si está completamente consciente de cómo funcionan y está bastante seguro de que no afectará el rendimiento, hágalo
Cursor de SQL Server: por qué la gente (no) los usa ?
La última pregunta que me gustaría responder es: ¿Por qué alguien usaría un cursor? Así es como lo veo:
- Las personas que los usan para trabajos únicos o acciones regulares en las que no afectarán el rendimiento tienen la excusa. Una de las razones es que dicho código es código de procedimiento, y si está acostumbrado a él, es muy legible
- Por otro lado, aquellos que comenzaron a aprender sobre bases de datos y están acostumbrados a la programación de procedimientos usan cursores porque, como se mencionó, están mucho más cerca de la programación procedimental que de las bases de datos. Esta no es una razón para usarlos, porque la única excusa aquí sería que simplemente no conoces la otra forma (correcta) de hacer las cosas
- Lo más importante acerca de los cursores es que son lentos en comparación con las sentencias SQL y, por lo tanto, debe evitar su uso porque tarde o temprano provocarán problemas de rendimiento (a menos que sepa exactamente lo que está haciendo y por qué)
I Le resultará útil comprender el concepto de cursores porque hay una gran posibilidad de que los encuentre en el camino. Fueron populares antes de que se agregaran algunas opciones nuevas a SQL Server. Además, existe la posibilidad de que continúe trabajando en un sistema en el que alguien antes de que lo usara, y tendrá que continuar donde se detuvo. Tal vez necesite reemplazar el cursor (código de procedimiento) con SQL (código declarativo).
Conclusión
No hay mejor conclusión sobre los cursores que no los use 🙂 SQL Server implementó muchos cambios que resuelven problemas que antes eran difíciles de resolver usando código declarativo. Es mejor dedicar algo de tiempo a investigar y aprender algo nuevo y, finalmente, a producir un código óptimo. Por supuesto, puede usarlos si sabe por qué lo hace y conoce los posibles problemas relacionados con ellos.
Tabla de contenido
Aprenda SQL : CREATE DATABASE & Operaciones de CREATE TABLE
Aprende SQL: INSERT INTO TABLE
Aprende SQL: Clave principal
Aprender SQL: clave externa
Aprender SQL: instrucción SELECT
Aprender SQL: INNER JOIN vs LEFT JOIN
Aprenda SQL: Scripts SQL
Aprenda SQL: Tipos de relaciones
Aprenda SQL: Unir varias tablas
Aprenda SQL: funciones agregadas
Aprenda SQL: ¿Cómo escribir una consulta SELECT compleja?
Aprenda SQL: La base de datos INFORMATION_SCHEMA
Aprenda SQL: Tipos de datos SQL
Aprenda SQL: Teoría de conjuntos
Aprenda SQL: funciones definidas por el usuario
Aprenda SQL: procedimientos almacenados definidos por el usuario
Aprenda SQL: Vistas SQL
Aprenda SQL: disparadores de SQL
Aprenda SQL: practique consultas de SQL
Aprenda SQL: ejemplos de consultas de SQL
Aprenda SQL: cree un informe manualmente mediante consultas SQL
Aprenda SQL: funciones de fecha y hora de SQL Server
Aprenda SQL: cree informes de SQL Server uso de funciones de fecha y hora
Aprenda SQL: tablas dinámicas de SQL Server
Aprenda SQL: exportación de SQL Server a Excel
Aprenda SQL: Introducción a los bucles de SQL Server
Aprenda SQL: Cursores de SQL Server
Aprenda SQL: Prácticas recomendadas de SQL para eliminar y actualizar datos
Aprenda SQL: Convenciones de nomenclatura
Aprenda SQL: Trabajos relacionados con SQL
Aprenda SQL: Uniones no Equi en SQL Server
Aprenda SQL: inyección de SQL
- Autor
- Publicaciones recientes
Sus compromisos pasados y presentes varían desde el diseño y codificación de bases de datos hasta la enseñanza, la consultoría y la redacción de bases de datos. Además, no hay que olvidar, BI, creación de algoritmos, ajedrez, filatelia, 2 perros, 2 gatos, 1 esposa, 1 bebé …
Lo puedes encontrar en LinkedIn
Ver todas las publicaciones de Emil Drkusic
- Aprenda SQL: Inyección SQL – 2 de noviembre de 2020
- Aprenda SQL: Non-Equi Joins en SQL Server – 29 de septiembre de 2020
- Aprenda SQL: Trabajos relacionados con SQL – 1 de septiembre de 2020