Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

Procedimiento almacenado de insercion (con cursores)

Estas en el tema de Procedimiento almacenado de insercion (con cursores) en el foro de SQL Server en Foros del Web. Hola gente del foro... Tengo una duda de como crear un procedimiento almacenado en sql server, que inserte datos en una tabla (datos que se ...
  #1 (permalink)  
Antiguo 06/07/2009, 09:35
Avatar de pyroCL  
Fecha de Ingreso: marzo-2009
Ubicación: C#
Mensajes: 261
Antigüedad: 15 años, 1 mes
Puntos: 2
Procedimiento almacenado de insercion (con cursores)

Hola gente del foro...

Tengo una duda de como crear un procedimiento almacenado en sql server, que inserte datos en una tabla (datos que se le dan por parámetro) y otro dato que se extrae de un cursor.

Explico lo que quiero que haga.

1° Crear el procedimiento
2° Declaro los datos que se recibirán
3° creo el cursor, seleccionando todos los registros que cumplen con una condicion dada
4° comienzo el procedimiento (begin)
5° por cada uno de los registros que están en el cursor inserto en una tabla los datos resibidos por parámetro y el dato que extraigo del cursor.
6° fin del procedimiento-

Pongo el código de como lo haría, lo malo es que no se como hacer ese codigo para sql server, ya que por ejemplo el cursor no se puede recorrer con un for...

Código:
CREATE PROCEDURE insertarPorCargo
	@CODIGO_CAP VARCHAR(20)
	@CODIGO_CARGO VARCHAR(20)
	@FECHA DATETIME
	@TEMA VARCHAR(40)
	@DURACION VARCHAR(10)
	@LUGAR VARCHAR(30)
	@CODDEPTO VARCHAR(20)
	@HORA_INICIO VARCHAR(10)
	@HORA_FIN VARCHAR(10)
	@TIPO VARCHAR(10)
	@RUT_RELATOR VARCHAR(15)

	CURSOR C1 IS
		SELECT RUT
		FROM EMPLEADO 
		WHERE CODIGO_CARGO = @CODIGO_CARGO
		ORDER BY RUT;
AS
BEGIN

	
	FOR REGISTRO IN C1 LOOP
		INSERT INTO CAPACITACION VALUES(@CODIGO_CAP, @FECHA, @TEMA, @DURACION, @LUGAR, @CODDEPTO, @HORA_INICIO, @HORA_FIN, @TIPO, @CODIGO_CARGO, @RUT_RELATOR, REGISTRO.RUT)
	END LOOP
	SET NOCOUNT ON;

   
END
Gracias gente del foro! Espero que alguien me pueda ayudar....

Última edición por pyroCL; 06/07/2009 a las 09:49
  #2 (permalink)  
Antiguo 06/07/2009, 10:16
Avatar de Dradi7  
Fecha de Ingreso: junio-2008
Ubicación: Peru - Lima
Mensajes: 1.518
Antigüedad: 15 años, 10 meses
Puntos: 220
Respuesta: Procedimiento almacenado de insercion (con cursores)

Prueba Asi:
Código sql:
Ver original
  1. CREATE PROCEDURE insertarPorCargo
  2. (
  3.     @CODIGO_CAP VARCHAR(20)
  4.     @CODIGO_CARGO VARCHAR(20)
  5.     @FECHA DATETIME
  6.     @TEMA VARCHAR(40)
  7.     @DURACION VARCHAR(10)
  8.     @LUGAR VARCHAR(30)
  9.     @CODDEPTO VARCHAR(20)
  10.     @HORA_INICIO VARCHAR(10)
  11.     @HORA_FIN VARCHAR(10)
  12.     @TIPO VARCHAR(10)
  13.     @RUT_RELATOR VARCHAR(15)
  14. )
  15. AS
  16. BEGIN
  17.    
  18.     SET NOCOUNT ON;
  19.  
  20.     DECLARE C1 CURSOR FOR
  21.             SELECT RUT FROM EMPLEADO
  22.             WHERE CODIGO_CARGO = @CODIGO_CARGO
  23.             ORDER BY RUT;
  24.  
  25.     OPEN C1
  26.     FETCH NEXT FROM C1
  27.  
  28.     WHILE @@FETCH_STATUS = 0
  29.         BEGIN
  30.             INSERT INTO CAPACITACION VALUES(@CODIGO_CAP, @FECHA, @TEMA, @DURACION, @LUGAR, @CODDEPTO, @HORA_INICIO, @HORA_FIN, @TIPO, @CODIGO_CARGO, @RUT_RELATOR, REGISTRO.RUT)
  31.             FETCH NEXT FROM C1
  32.         END
  33.    
  34. END
__________________
La clave de todo triunfador es eliminar todas sus excusas y sus limitaciones
  #3 (permalink)  
Antiguo 06/07/2009, 10:52
Avatar de pyroCL  
Fecha de Ingreso: marzo-2009
Ubicación: C#
Mensajes: 261
Antigüedad: 15 años, 1 mes
Puntos: 2
Respuesta: Procedimiento almacenado de insercion (con cursores)

Código =SQL:
Ver original
  1. CREATE PROCEDURE insertarPorCargo
  2. (
  3.     @CODIGO_CAP VARCHAR(20),
  4.     @CODIGO_CARGO VARCHAR(20),
  5.     @FECHA DATETIME,
  6.     @TEMA VARCHAR(40),
  7.     @DURACION VARCHAR(10),
  8.     @LUGAR VARCHAR(30),
  9.     @CODDEPTO VARCHAR(20),
  10.     @HORA_INICIO VARCHAR(10),
  11.     @HORA_FIN VARCHAR(10),
  12.     @TIPO VARCHAR(10),
  13.     @RUT_RELATOR VARCHAR(15)
  14. )
  15. AS
  16. BEGIN
  17.    
  18.     SET NOCOUNT ON;
  19.  
  20.     DECLARE C1 CURSOR FOR
  21.             SELECT RUT FROM EMPLEADO
  22.             WHERE CODIGO_CARGO = @CODIGO_CARGO
  23.             ORDER BY RUT;
  24.  
  25.     OPEN C1
  26.     FETCH NEXT FROM C1
  27.  
  28.     WHILE @@FETCH_STATUS = 0
  29.         BEGIN
  30.             INSERT INTO CAPACITACION VALUES(@CODIGO_CAP, @FECHA, @TEMA, @DURACION, @LUGAR, @CODDEPTO, @HORA_INICIO, @HORA_FIN, @TIPO, @CODIGO_CARGO, @RUT_RELATOR, C1.RUT)
  31.             FETCH NEXT FROM C1
  32.         END
  33.    
  34. END

Gracias por responde.....

Ese código tira un sólo error que no sé como solucionar... y es el C1.RUT, como accedo a los datos que están en el cursor para ir insertándolos????

Gracias nuevamente..

Última edición por pyroCL; 06/07/2009 a las 11:07
  #4 (permalink)  
Antiguo 06/07/2009, 11:38
Avatar de Dradi7  
Fecha de Ingreso: junio-2008
Ubicación: Peru - Lima
Mensajes: 1.518
Antigüedad: 15 años, 10 meses
Puntos: 220
Respuesta: Procedimiento almacenado de insercion (con cursores)

Pruebalo asi
Código sql:
Ver original
  1. CREATE PROCEDURE insertarPorCargo
  2. (
  3.     @CODIGO_CAP VARCHAR(20)
  4.     @CODIGO_CARGO VARCHAR(20)
  5.     @FECHA DATETIME
  6.     @TEMA VARCHAR(40)
  7.     @DURACION VARCHAR(10)
  8.     @LUGAR VARCHAR(30)
  9.     @CODDEPTO VARCHAR(20)
  10.     @HORA_INICIO VARCHAR(10)
  11.     @HORA_FIN VARCHAR(10)
  12.     @TIPO VARCHAR(10)
  13.     @RUT_RELATOR VARCHAR(15)
  14. )
  15. AS
  16. BEGIN
  17.    
  18.     SET NOCOUNT ON;
  19.  
  20.     DECLARE @RUT VARCHAR(30) -- SUPONGO QUE EL TIPO ES VARCHAR
  21.  
  22.     DECLARE C1 CURSOR FOR
  23.             SELECT RUT FROM EMPLEADO
  24.             WHERE CODIGO_CARGO = @CODIGO_CARGO
  25.             ORDER BY RUT;
  26.  
  27.     OPEN C1
  28.     FETCH NEXT FROM C1 INTO @RUT
  29.  
  30.     WHILE @@FETCH_STATUS = 0
  31.         BEGIN
  32.             INSERT INTO CAPACITACION VALUES(@CODIGO_CAP, @FECHA, @TEMA, @DURACION, @LUGAR, @CODDEPTO, @HORA_INICIO, @HORA_FIN, @TIPO, @CODIGO_CARGO, @RUT_RELATOR, @RUT)
  33.             FETCH NEXT FROM C1 INTO @RUT
  34.         END
  35.    
  36. END
__________________
La clave de todo triunfador es eliminar todas sus excusas y sus limitaciones
  #5 (permalink)  
Antiguo 06/07/2009, 12:36
Avatar de pyroCL  
Fecha de Ingreso: marzo-2009
Ubicación: C#
Mensajes: 261
Antigüedad: 15 años, 1 mes
Puntos: 2
Respuesta: Procedimiento almacenado de insercion (con cursores)

MUCHAS GRACIAS!!

Funciona perfecto!!!!.......
__________________
La verdadera sabiduría está en reconocer la propia ignorancia.
  #6 (permalink)  
Antiguo 06/07/2009, 20:44
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Procedimiento almacenado de insercion (con cursores)

¿Porque con un cursor?
  #7 (permalink)  
Antiguo 06/07/2009, 20:56
Avatar de alfcm  
Fecha de Ingreso: mayo-2009
Mensajes: 291
Antigüedad: 15 años
Puntos: 7
Respuesta: Procedimiento almacenado de insercion (con cursores)

No uses cursores cuando no sea necesario, estas acuchillando a tu base de datos
  #8 (permalink)  
Antiguo 07/07/2009, 20:46
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Procedimiento almacenado de insercion (con cursores)

¿acuchillando?, la esta haciendo pedazos !!, jajaja
  #9 (permalink)  
Antiguo 08/07/2009, 06:42
Avatar de pyroCL  
Fecha de Ingreso: marzo-2009
Ubicación: C#
Mensajes: 261
Antigüedad: 15 años, 1 mes
Puntos: 2
Respuesta: Procedimiento almacenado de insercion (con cursores)

Y si no uso un cursor que uso?...

La otra opción es utilizar tablas temporales, pero...
¿Si es que se llega a perder la conexión a la base de datos?... Ahí no me sirven las tablas temporales.

Entonces si no puedo usar cursores ni tablas que uso?

...

Gracias.
__________________
La verdadera sabiduría está en reconocer la propia ignorancia.
  #10 (permalink)  
Antiguo 08/07/2009, 21:11
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Procedimiento almacenado de insercion (con cursores)

No tengo forma de probarlo:

INSERT INTO CAPACITACION (lista de campos que hacer referencia a tus variables)
SELECT @CODIGO_CAP
,@FECHA
,@TEMA
,@DURACION
,@LUGAR
,@CODDEPTO
,@HORA_INICIO
,@HORA_FIN
,@TIPO
,@CODIGO_CARGO
,@RUT_RELATOR
,RUT
FROM EMPLEADO
WHERE CODIGO_CARGO = @CODIGO_CARGO
  #11 (permalink)  
Antiguo 10/07/2009, 16:58
 
Fecha de Ingreso: octubre-2005
Mensajes: 180
Antigüedad: 18 años, 7 meses
Puntos: 0
Respuesta: Procedimiento almacenado de insercion (con cursores)

Lo que veo es que quieres hacer inserts masivos con tu for each.

Lo que puedes usar es FOR XML y OPENXML.

Te dejo un link para que le eches un vistazo!!

http://msdn.microsoft.com/es-es/library/ms191268.aspx

Salu2...
__________________
El conocimiento se alimenta de la repeticion y la consistencia!!! (Miguel--in-- 1983---....)
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 21:39.