{"id":2342,"date":"2020-11-24T15:34:32","date_gmt":"2020-11-24T15:34:32","guid":{"rendered":"http:\/\/manualsqlserver.com\/?p=2342"},"modified":"2020-11-24T15:34:33","modified_gmt":"2020-11-24T15:34:33","slug":"usando-cursor-en-sql-server","status":"publish","type":"post","link":"https:\/\/manualsqlserver.com\/?p=2342","title":{"rendered":"Usando cursor en SQL Server"},"content":{"rendered":"\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"220\" height=\"260\" src=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_CursorOrdenaNotas__D.png\" alt=\"\" class=\"wp-image-2343\"\/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Usando Cursores en SQL Server<\/strong><\/h2>\n\n\n\n<p>Los cursores permiten almacenar los datos de una consulta T-SQL en memoria y poder manipular los datos de los elementos resultantes para realizar operaciones con ellos. Se recomienda su uso con cierto cuidado porque consume mucha memoria, la instrucci\u00f3n select que llena el cursor debe ser lo m\u00e1s selectiva posible.<\/p>\n\n\n\n<!--more-->\n\n\n\n<p><strong>Proceso para declarar, abrir, usar, cerrar y liberar los datos de un cursor<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\"><li>Declarar el cursor, utilizando DECLARE Cursor<\/li><li>Abrir el cursor, utilizando OPEN<\/li><li>Leer los datos del cursor, utilizando FETCH \u2026 INTO dentro de una estructura While<\/li><li>Cerrar el cursor, utilizando CLOSE<\/li><li>Liberar el cursor, utilizando DEALLOCATE<\/li><\/ol>\n\n\n\n<script async src=\"\/\/pagead2.googlesyndication.com\/pagead\/js\/adsbygoogle.js\"><\/script>\n<ins class=\"adsbygoogle\"\n     style=\"display:block; text-align:center;\"\n     data-ad-layout=\"in-article\"\n     data-ad-format=\"fluid\"\n     data-ad-client=\"ca-pub-2636008503986218\"\n     data-ad-slot=\"1902193434\"><\/ins>\n<script>\n     (adsbygoogle = window.adsbygoogle || []).push({});\n<\/script>\n\n\n\n<p style=\"font-size:18px\"><strong>Para mas informaci\u00f3n ver<br><\/strong><a href=\"https:\/\/manualsqlserver.com\/?p=343\" target=\"_blank\" rel=\"noreferrer noopener\">Cursores en SQL Server<\/a><br><a href=\"https:\/\/manualsqlserver.com\/?p=1630\" target=\"_blank\" rel=\"noreferrer noopener\">Cursores con variables tipo tabla<\/a><br><a href=\"https:\/\/manualsqlserver.com\/?p=2078\" target=\"_blank\" rel=\"noreferrer noopener\">Cursores en Store procedures<\/a><br><a href=\"https:\/\/manualsqlserver.com\/?p=1788\" target=\"_blank\" rel=\"noreferrer noopener\">Fetch Next en Select<\/a><br><a href=\"https:\/\/manualsqlserver.com\/?p=117\" target=\"_blank\" rel=\"noreferrer noopener\">Crear tablas<\/a><br><a href=\"https:\/\/manualsqlserver.com\/?p=294\" target=\"_blank\" rel=\"noreferrer noopener\">Insertar registros<\/a><br><a href=\"https:\/\/manualsqlserver.com\/?p=522\" target=\"_blank\" rel=\"noreferrer noopener\">Variables tipo tabla<\/a><br><a href=\"https:\/\/manualsqlserver.com\/?p=571\" target=\"_blank\" rel=\"noreferrer noopener\">Uni\u00f3n en Select<\/a><\/p>\n\n\n\n<p>En este art\u00edculo se muestra como usar un cursor, el ejemplo es con una tabla de Alumnos, tiene registrado el c\u00f3digo, su nombre y cinco calificaciones, se pretende hacer un reporte de estas en columnas adicionales a la tabla ordenando las calificaciones de menor a mayor.<\/p>\n\n\n\n<p><strong>Usando la base de datos Northwind<\/strong><\/p>\n\n\n\n<p>use Northwind<br>go<\/p>\n\n\n\n<p><strong>La tabla de alumnos y la inserci\u00f3n de los registros para el ejercicio.<\/strong><\/p>\n\n\n\n<p>Create table Alumnos<br>(<br>AlumnosCodigo nchar(4),<br>AlumnosNombre nvarchar(50),<br>AlumnosNota1 int,<br>AlumnosNota2 int,<br>AlumnosNota3 int,<br>AlumnosNota4 int,<br>AlumnosNota5 int<br>constraint AlumnosPK primary key (AlumnosCodigo)<br>)<br>go<\/p>\n\n\n\n<p>Insert into Alumnos<br>Values (&#8216;0001&#8242;,&#8217;Fernando Luque&#8217;,18,5,12,8,13),<br>(&#8216;0002&#8242;,&#8217;Fagos&#8217;,9,15,12,7,13),<br>(&#8216;0003&#8242;,&#8217;Vania&#8217;,20,6,15,18,14),<br>(&#8216;0004&#8242;,&#8217;Lucas&#8217;,18,15,2,8,17),<br>(&#8216;0005&#8242;,&#8217;Pedro&#8217;,4,5,20,18,13)<br>go<\/p>\n\n\n\n<p><strong>El listado de los alumnos<\/strong><br>select * from Alumnos<br>go<br>El resultado se muestra en la siguiente imagen.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_CursorOrdenaNotas_01.png\" alt=\"\" class=\"wp-image-2344\" width=\"717\" height=\"162\" srcset=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_CursorOrdenaNotas_01.png 939w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_CursorOrdenaNotas_01-300x68.png 300w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_CursorOrdenaNotas_01-768x174.png 768w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_CursorOrdenaNotas_01-795x180.png 795w\" sizes=\"auto, (max-width: 717px) 100vw, 717px\" \/><\/figure>\n\n\n\n<p style=\"font-size:22px\"><strong>El cursor para obtener el resultado es el siguiente<\/strong><\/p>\n\n\n\n<p>Declare cursorAlumnos cursor for<br>select * from Alumnos<br>Open cursorAlumnos<br>Declare @Resultados Table<br>(<br>Codigo nchar(4),<br>Nombre nvarchar(50),<br>Nota1 int,<br>Nota2 int,<br>Nota3 int,<br>Nota4 int,<br>Nota5 int,<br>Primero int,<br>Segundo int,<br>Tercero int,<br>Cuarto int,<br>Quinto int<br>)<br>&#8212; Variables para los datos le\u00eddos del cursor.<br>Declare @Codigo nchar(4), @Nombre nvarchar(50), @Nota1 int, @Nota2 int, @Nota3 int, @Nota4 int, @Nota5 int<br>Fetch cursorAlumnos into @Codigo , @Nombre , @Nota1 , @Nota2 , @Nota3 , @Nota4 , @Nota5<br>&#8212; Recorrer el cursor<br>while (@@FETCH_STATUS = 0)<br>Begin<br>Declare @Valor1 int, @Valor2 int, @Valor3 int, @Valor4 int, @Valor5 int<br>Declare @NotasOrdenadas Table<br>(<br>Orden int ,N int<br>)<br>Insert into @NotasOrdenadas<br>select 1,AlumnosNota1 from Alumnos where AlumnosCodigo = @Codigo<br>union<br>select 2, AlumnosNota2 from Alumnos where AlumnosCodigo = @Codigo<br>union<br>select 3, AlumnosNota3 from Alumnos where AlumnosCodigo = @Codigo<br>union<br>select 4, AlumnosNota4 from Alumnos where AlumnosCodigo = @Codigo<br>union<br>select 5, AlumnosNota5 from Alumnos where AlumnosCodigo = @Codigo<br>Set @Valor1 = ( select top 1 n from @NotasOrdenadas order by N asc)<br>Set @Valor2 = ( select n from @NotasOrdenadas order by N asc offset 1 rows fetch next 1 rows only)<br>Set @Valor3 = ( select n from @NotasOrdenadas order by N asc offset 2 rows fetch next 1 rows only)<br>Set @Valor4 = ( select n from @NotasOrdenadas order by N asc offset 3 rows fetch next 1 rows only)<br>Set @Valor5 = ( select n from @NotasOrdenadas order by N asc offset 4 rows fetch next 1 rows only)<br>delete @NotasOrdenadas<br>&#8212; select @Valor1, @Valor2, @Valor3, @Valor4, @Valor5<br>insert into @Resultados values<br>(@Codigo , @Nombre , @Nota1 , @Nota2 , @Nota3 , @Nota4 , @Nota5,<br>@Valor1, @Valor2, @Valor3, @Valor4, @Valor5)<br>Fetch cursorAlumnos into @Codigo , @Nombre , @Nota1 , @Nota2 , @Nota3 , @Nota4 , @Nota5<br>End<br>Close cursorAlumnos<br>Deallocate cursorAlumnos<br>select * from @Resultados<br>go<br><strong>El resultado se muestra en la siguiente imagen.<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_CursorOrdenaNotas_02.png\" alt=\"\" class=\"wp-image-2345\" width=\"812\" height=\"406\" srcset=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_CursorOrdenaNotas_02.png 939w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_CursorOrdenaNotas_02-300x150.png 300w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_CursorOrdenaNotas_02-768x384.png 768w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_CursorOrdenaNotas_02-795x398.png 795w\" sizes=\"auto, (max-width: 812px) 100vw, 812px\" \/><\/figure>\n\n\n\n<p>Note el reporte del cursor, el alumno con c\u00f3digo 0001 tiene 5 notas, estas calificaciones son: Nota1: 18, Nota2: 5, Nota3: 12, Nota4: 8 y Nota5: 13, el cursor a\u00f1ade al reporte cinco columnas adicionales con las notas ordenadas de menor a mayor.<\/p>\n\n\n\n<script async src=\"\/\/pagead2.googlesyndication.com\/pagead\/js\/adsbygoogle.js\"><\/script>\n<ins class=\"adsbygoogle\"\n     style=\"display:block; text-align:center;\"\n     data-ad-layout=\"in-article\"\n     data-ad-format=\"fluid\"\n     data-ad-client=\"ca-pub-2636008503986218\"\n     data-ad-slot=\"1902193434\"><\/ins>\n<script>\n     (adsbygoogle = window.adsbygoogle || []).push({});\n<\/script>\n","protected":false},"excerpt":{"rendered":"<p>Usando Cursores en SQL Server Los cursores permiten almacenar los datos de una consulta T-SQL en memoria y poder manipular los datos de los elementos resultantes para realizar operaciones con ellos. Se recomienda su uso con cierto cuidado porque consume mucha memoria, la instrucci\u00f3n select que llena el cursor debe ser lo m\u00e1s selectiva posible.<\/p><p><a class=\"more-link btn\" href=\"https:\/\/manualsqlserver.com\/?p=2342\">Seguir leyendo<\/a><\/p>\n","protected":false},"author":1,"featured_media":2343,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[232,8],"tags":[70,73,171],"class_list":["post-2342","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-cursoressql","category-programacion","tag-cursor","tag-declare-cursor","tag-variable-tipo-tabla","nodate","item-wrap"],"_links":{"self":[{"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=\/wp\/v2\/posts\/2342","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2342"}],"version-history":[{"count":1,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=\/wp\/v2\/posts\/2342\/revisions"}],"predecessor-version":[{"id":2346,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=\/wp\/v2\/posts\/2342\/revisions\/2346"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=\/wp\/v2\/media\/2343"}],"wp:attachment":[{"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2342"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2342"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2342"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}