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
http://technet.microsoft.com/es-es/library/ms187308.aspx
Espero te ayude. Saludos.