Popular

Obten claves web y navega gratis Router keygen para Android

Error 403 Forbidden con phpmyadmin y WAMP Server

Realizar suma, resta y división con javascript

Manejo de Cursor en SQL Server (Recorrer Select)

Muy buen día a todos los que leen esté blog que vaya ya somos demasiados los lectores les agradezco por sus visitas espero se lleven algo de esté sitio.

El día de hoy me levante programando así es estoy trabajando para una empresa de la ciudad de México cómo programador a distancia, por lo que en mi encomienda tenemos un sistema en Windows Presentation Foundation “WPF”, el cuál cuando fue concebido o creado no se hizo un buen trabajo con la base de datos, digamos no que no se haya echo un buen trabajo si no que tal vez no se tuvo la misma visión que la que hemos tenido nosotros actualmente. Por lo que comenzamos un proceso de cambios en el sistema y hemos comenzado esto a la par de producción o sea mientras el sistema funciona nosotros actualizamos hemos tenido que agregar Triggers y procedimientos almacenados extras para apoyarnos.

Pero vamos al grano, hoy aprenderemos a cómo con un select podemos recorrer una tabla e ir haciendo cálculos o en su caso como el ejemplo que les mostraré insertar datos a otras tablas esto por medio de un cursor, lo podemos hacer también con un while pero en está ocasión use un cursor de SQL Server.

CREATE PROCEDURE UPS_ACTUALIZAEMPRESAS
AS
BEGIN
DECLARE @empresa varchar(100)
DECLARE @correo varchar(4000)
DECLARE CR CURSOR FAST_FORWARD FOR
      SELECT empresa, correo FROM empleos FOR READ ONLY;
     
      OPEN CR;
     
      FETCH CR INTO @empresa, @correo;
     
while @@fetch_status = 0
begin

fetch cr into @empresa, @correo;

--Aquí realizamos la logica del negocio deseada.
close cr;
deallocate cr;
END
GO

Esta es la estructura básica donde, aquí en mi ejemplo lo hice creando un procedimiento almacenado pero ustedes pueden no hacerlo así verdad, lo importante es la creación del cursor que es donde declaro DECLARE CR CURSOR si observan utilice un select a una tabla donde le dije que será solo lectura.
Posteriormente abro el cursor y obtengo los valores en las variables con la función o línea    FETCH CR INTO @empresa, @correo;
Después de ejecutar en el ciclo nuestras operaciones necesitamos cerrar el cursor y liberarlo esto lo hacemos así:
close cr;
deallocate cr;

Esta es la estructura básica, esto es una de las diversas formas en el uso de cursores se pueden hacer bastantes cosas pero es una pequeña explicación de una manera de recorrer un select y realizar un tratamiento con SQL aquí abajo les dejo el Query que yo arme por si desean darle un vistazo es un pequeño ejemplo de uso de cursores donde inserto en diferentes tablas por descripción de empresa ya que no tenemos ID’s en las tablas.


-- =============================================
-- Author:        Uziel Esau Mercado
-- Create date: 06/10/2013
-- =============================================
CREATE PROCEDURE UPS_ACTUALIZAEMPRESAS
      -- Add the parameters for the stored procedure here
AS
BEGIN
DECLARE @empleoId int
DECLARE @empresa varchar(100)
DECLARE @correo varchar(4000)
DECLARE @existData int

DECLARE CR CURSOR FAST_FORWARD FOR
      SELECT empresa, correo FROM empleos FOR READ ONLY;
      OPEN CR;
      FETCH CR INTO @empresa, @correo;
while @@fetch_status = 0
begin
fetch cr into @empresa, @correo;
SET @existData = 0
SELECT @existData = Count(*) FROM Empresas
WHERE RTRIM(LTRIM(nombre)) = RTRIM(LTRIM(@empresa))

IF @existData = 0
      BEGIN
            INSERT INTO dbo.Empresas(nombre, isactive, created)
            VALUES (RTRIM(LTRIM(@empresa)), 1, getDate());
            SET @empleoId = @@identity
      END
ELSE
      BEGIN
            SELECT @empleoId =  empresaId
            FROM Empresas
            WHERE RTRIM(LTRIM(nombre)) = RTRIM(LTRIM(@empresa))
      END  
      SET @existData = 0

      SELECT @existData = Count(*) FROM empresaContactos
      WHERE RTRIM(LTRIM(email)) = RTRIM(LTRIM(@correo))
     
      IF @existData = 0
      BEGIN
      INSERT INTO dbo.empresaContactos(email, created, isactive, empresaId)
      VALUES (RTRIM(LTRIM(@correo)), getDate(), 1, @empleoId);
END
end
close cr;
deallocate cr;
END
GO


Dejen sus comentarios y dudas... Saludos...

Comentarios

Oscar Benitez ha dicho que…
Muy buen aporte, gracias, justo lo que andaba buscando, sólo una pregunta: cuando se declara/crea el cursor, después de open está la instrucción FETCH CR INTO @empresa, @correo; y luego al iniciar el while, también está la misma instrucción, ¿Esto debe ser así? creo se puede omitir alguna de las dos. Un saludo.
TIntelligence ha dicho que…
@Oscar Benitez Que tal amigo así es podemos eliminar está parte while @@fetch_status = 0, por lo que funcionaría de manera eficiente. Por lo que agregue está validación es porque te indica si se ejecuto de manera correctamente la instrucción FETCH más detalle al respecto aquí:
http://technet.microsoft.com/es-es/library/ms187308.aspx

Espero te ayude. Saludos.

Entradas populares de este blog

Error 403 Forbidden con phpmyadmin y WAMP Server

Número de filas afectadas por instrucción PL/SQL en Oracle [Utilidades].

Como truncar un número decimal en C# sin redondear.