Principales respuestas
Guardar datos de una tabla a otra tabla usuando cursores en sql server

Pregunta
-
Hola, tengo un problema tengo 2 tablas (DATA y Justificar_Incidencias), quisiera saber como guardar (Id_Usuario, Fecha y Hora) de mi tabla DATA a mi tabla Justificar_Incidencias Por medio de un cursor.
nota: al guardar en la tabla DATA tome esos 3 campos y los guarde en la otra tabla.
Respuestas
-
Te sugiero -una vez mas- escribir el requerimiento completo desde un inicio para evitar darle tantas vueltas, ¿es posible?
CREATE PROCEDURE dbo.Grid @Condicion numeric(10,0), @Id_Data int, @Id_Usuario int, @Fecha varchar(100), @Hora varchar(100) AS BEGIN --Insertar en la tabla [DATA] SET @Id_Data = (SELECT MAX(Id_Data) + 1 FROM DATA); INSERT INTO dbo.DATA (Id_Data, Id_Usuario, Fecha, Hora) SELECT @Id_Data, @Id_Usuario, @Fecha, @Hora WHERE (@Condicion = 1); --Insertar en la tabla [Justificar_Incidencias] sólo si hay 4 registros WITH RegistroIngresos AS ( SELECT d.Id_Usuario, d.Fecha, d.Hora AS [Hora], ROW_NUMBER() OVER(PARTITION BY d.Id_Usuario, d.Fecha ORDER BY CONVERT(time(0), d.Hora)) AS [Fila] FROM DATA d WHERE (Id_Usuario = @Id_Usuario) AND (Fecha = @Fecha) ) INSERT INTO Justificar_Incidencias (Id_Usuario, Fecha, Hora_Entrada, Hora_SComer, Hora_EComer, Hora_Salida) SELECT i.Id_Usuario, i.Fecha, MAX(CASE WHEN i.Fila = 1 THEN i.Hora END), MAX(CASE WHEN i.Fila = 2 THEN i.Hora END), MAX(CASE WHEN i.Fila = 3 THEN i.Hora END), MAX(CASE WHEN i.Fila = 4 THEN i.Hora END) FROM RegistroIngresos i WHERE NOT EXISTS (SELECT 1 FROM Justificar_Incidencias WHERE (i.Id_Usuario = Id_Usuario) AND (i.Fecha = Fecha)) GROUP BY i.Id_Usuario, i.Fecha HAVING COUNT(*) = 4; END
Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.- Marcado como respuesta Eduardo_Ramirez viernes, 24 de febrero de 2017 22:40
Todas las respuestas
-
¿Cursores? No entiendo que aplicación le quieres dar en este caso.
- ¿Quieres insertar -una o varias filas- en la tabla [Justificar_Incidencias] por cada nueva fila en la tabla [DATA]? ¿Lo que requieres no es un trigger que actúe sobre una operación de INSERT? ¿Y por qué no insertas en ambas tablas desde la aplicación?
- ¿Quieres copiar los datos de la tabla [DATA] a la tabla [Justificar_Incidencias]? ¿No basta con la instrucción INSERT INTO?
Te recomiendo des mayores detalles de lo que deseas realizar.
Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios. -
hola
>>tengo un problema tengo 2 tablas (DATA
porque el nombre "DATA" uno menos significativo no tenias
defiens algo mejor que represente a los datos que persiste alli
>>de mi tabla DATA a mi tabla Justificar_Incidencias Por medio de un cursor.
porque no usas un SELECT INTO ?
podrias volcar los datos sin necesidad de ningun cursor
Leandro Tuttini
Blog
MVP Profile
Buenos Aires
Argentina -
Perdón por no explicarme bien.
1 - quiero insertar en la tabla Autorizar_Incidencias solo 1 vez (Id_Usuario y Fecha) , que las fechas estén acomodadas (8:00:00 Hora_Entrada, 2:00:00 Hora_SComer, 3:30:00 Hora_EComer y 6:30:00 Hora_Salida) tomando los datos de la tabla DATA , espero darme a entender.
-
De acuerdo, la resolución es simple sin embargo te dejo dos consideraciones:
- ¿La columna [Hora] es de tipo time? En los datos que muestras no especificas AM/PM, también podrías especificar el tiempo basado en un reloj de 24 horas, algo como:
(17, '2017-02-05', '8:01:21 am'), (17, '2017-02-05', '2:00:05 pm'),
- En el ejemplo adjunto muestras cinco registros por usuario/día, ¿hay marcaciones que se duplican?, debes de resolver ese caso para obtener los resultados esperados.
Resolviendo los puntos anteriores la consulta para insertar los datos es simple:
WITH RegistroIngresos AS ( SELECT d.Id_Usuario, d.Fecha, CONVERT(time(0), d.Hora) AS [Hora], ROW_NUMBER() OVER(PARTITION BY d.Id_Usuario, d.Fecha ORDER BY d.Hora) AS [Fila] FROM DATA d ) INSERT INTO Justificar_Incidencias (Id_Usuario, Fecha, Hora_Entrada, Hora_SComer, Hora_EComer, Hora_Salida) SELECT i.Id_Usuario, i.Fecha, MAX(CASE WHEN i.Fila = 1 THEN i.Hora END), MAX(CASE WHEN i.Fila = 2 THEN i.Hora END), MAX(CASE WHEN i.Fila = 3 THEN i.Hora END), MAX(CASE WHEN i.Fila = 4 THEN i.Hora END) FROM RegistroIngresos i GROUP BY i.Id_Usuario, i.Fecha;
Deberías tener el siguiente resultado:
Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios. -
El id_Usuario es del tipo entero , todos los demas son de tipo varchar , deben de ser 4 registros por id_usuario.
Conforme al codigo podria ponerlo en un SP o en el cursor?
- Editado Eduardo_Ramirez viernes, 24 de febrero de 2017 18:09
-
Indicas que deben ser cuatro registros por id_usuario pero en el ejemplo que adjuntas muestras cinco registros.
¿Cómo distingues -por ejemplo- que la hora 2:00 es AM o PM?, se puede hacer algo con los datos que tienes pero desde ya te adelanto que no esperes que los resultados sean predecibles si insistes en no diferenciar la hora (AM/PM).
--Insertar datos WITH RegistroIngresos AS ( SELECT d.Id_Usuario, d.Fecha, d.Hora AS [Hora], ROW_NUMBER() OVER(PARTITION BY d.Id_Usuario, d.Fecha ORDER BY (SELECT NULL)) AS [Fila] FROM DATA d ) INSERT INTO Justificar_Incidencias (Id_Usuario, Fecha, Hora_Entrada, Hora_SComer, Hora_EComer, Hora_Salida) SELECT i.Id_Usuario, i.Fecha, MAX(CASE WHEN i.Fila = 1 THEN i.Hora END), MAX(CASE WHEN i.Fila = 2 THEN i.Hora END), MAX(CASE WHEN i.Fila = 3 THEN i.Hora END), MAX(CASE WHEN i.Fila = 4 THEN i.Hora END) FROM RegistroIngresos i GROUP BY i.Id_Usuario, i.Fecha; --Revisar datos insertados SELECT * FROM Justificar_Incidencias
{...} Conforme al codigo podria ponerlo en un SP o en el cursor?
¿Cursor?. Depura y ejecuta la consulta que te he proporcionado y coméntanos los resultados.
Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios. -
Conforme sobre distinguir el AM o PM, las horas viene en formato 24 hrs. La hora que muestro en las tablas es ejemplo pero en realidad vienen en ese formato.
este es el resultado de la consulta
Las hora están desacomodadas- Editado Eduardo_Ramirez viernes, 24 de febrero de 2017 19:31
-
En un próximo hilo procura colocar los datos de ejemplo lo mas real posible para evitar especulaciones.
Define el procedimiento almacenado con los siguientes cambios:
CREATE PROCEDURE dbo.InsertarRegistroIngresos AS BEGIN --Insertar datos WITH RegistroIngresos AS ( SELECT d.Id_Usuario, d.Fecha, d.Hora AS [Hora], ROW_NUMBER() OVER(PARTITION BY d.Id_Usuario, d.Fecha ORDER BY CONVERT(time(0), d.Hora)) AS [Fila] FROM DATA d ) INSERT INTO Justificar_Incidencias (Id_Usuario, Fecha, Hora_Entrada, Hora_SComer, Hora_EComer, Hora_Salida) SELECT i.Id_Usuario, i.Fecha, MAX(CASE WHEN i.Fila = 1 THEN i.Hora END), MAX(CASE WHEN i.Fila = 2 THEN i.Hora END), MAX(CASE WHEN i.Fila = 3 THEN i.Hora END), MAX(CASE WHEN i.Fila = 4 THEN i.Hora END) FROM RegistroIngresos i WHERE NOT EXISTS (SELECT 1 FROM Justificar_Incidencias WHERE (i.Id_Usuario = Id_Usuario) AND (i.Fecha = Fecha)) GROUP BY i.Id_Usuario, i.Fecha; END GO
Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios. -
USE [Ejemplo]
GO
ALTER PROCEDURE [dbo].[Grid]
@Condicion numeric(10,0)
,@Id_Data int
,@Id_Usuario int
,@Fecha varchar(100)
,@Hora varchar(100)
AS
if @Condicion = 1
BEGIN
set @Id_Data = (Select Top (1) Id_Data FROM DATA Order BY Id_Data DESC )+1
INSERT INTO [dbo].[DATA]
([Id_Data]
,[Id_Usuario]
,[Fecha]
,[Hora]
VALUES
(@Id_Data,@Id_Usuario,@Fecha,@Hora)
ENDEste es el SP que uso para guardar los datos en mi tabla DATA.
Mi duda es si tengo que eliminarlo o incorporar el código del SP que pusiste?
-
Te sugiero -una vez mas- escribir el requerimiento completo desde un inicio para evitar darle tantas vueltas, ¿es posible?
CREATE PROCEDURE dbo.Grid @Condicion numeric(10,0), @Id_Data int, @Id_Usuario int, @Fecha varchar(100), @Hora varchar(100) AS BEGIN --Insertar en la tabla [DATA] SET @Id_Data = (SELECT MAX(Id_Data) + 1 FROM DATA); INSERT INTO dbo.DATA (Id_Data, Id_Usuario, Fecha, Hora) SELECT @Id_Data, @Id_Usuario, @Fecha, @Hora WHERE (@Condicion = 1); --Insertar en la tabla [Justificar_Incidencias] sólo si hay 4 registros WITH RegistroIngresos AS ( SELECT d.Id_Usuario, d.Fecha, d.Hora AS [Hora], ROW_NUMBER() OVER(PARTITION BY d.Id_Usuario, d.Fecha ORDER BY CONVERT(time(0), d.Hora)) AS [Fila] FROM DATA d WHERE (Id_Usuario = @Id_Usuario) AND (Fecha = @Fecha) ) INSERT INTO Justificar_Incidencias (Id_Usuario, Fecha, Hora_Entrada, Hora_SComer, Hora_EComer, Hora_Salida) SELECT i.Id_Usuario, i.Fecha, MAX(CASE WHEN i.Fila = 1 THEN i.Hora END), MAX(CASE WHEN i.Fila = 2 THEN i.Hora END), MAX(CASE WHEN i.Fila = 3 THEN i.Hora END), MAX(CASE WHEN i.Fila = 4 THEN i.Hora END) FROM RegistroIngresos i WHERE NOT EXISTS (SELECT 1 FROM Justificar_Incidencias WHERE (i.Id_Usuario = Id_Usuario) AND (i.Fecha = Fecha)) GROUP BY i.Id_Usuario, i.Fecha HAVING COUNT(*) = 4; END
Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.- Marcado como respuesta Eduardo_Ramirez viernes, 24 de febrero de 2017 22:40
-