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

Dudas en INSERT

Estas en el tema de Dudas en INSERT en el foro de SQL Server en Foros del Web. Buen dia, Tengo el siguiente escenario: Cliente: DB_Cliente: T_Venta: ID_Venta, Fecha, Cliente, Monto T_Detalle: ID_Detalle, ID_Venta, Articulo, Monto Servidor: DB_Servidor: T_Venta: ID_Venta(auto-generado) , Fecha, Cliente, ...
  #1 (permalink)  
Antiguo 03/08/2012, 14:38
Avatar de Agrevio  
Fecha de Ingreso: septiembre-2008
Ubicación: Perú
Mensajes: 80
Antigüedad: 15 años, 8 meses
Puntos: 2
Dudas en INSERT

Buen dia,

Tengo el siguiente escenario:

Cliente:
  • DB_Cliente:
    • T_Venta: ID_Venta, Fecha, Cliente, Monto
    • T_Detalle: ID_Detalle, ID_Venta, Articulo, Monto

Servidor:
  • DB_Servidor:
    • T_Venta: ID_Venta(auto-generado) , Fecha, Cliente, Monto, Venta(ID_Venta del cliente)
    • T_Detalle: ID_Detalle(auto-generado), ID_Venta (ID_Venta del Servidor), Articulo, Monto


Estoy haciendo un Insert de la DB_Cliente al DB_Servidor. De la siguiente manera:
Código SQL:
Ver original
  1. INSERT [DB_Servidor].[DBO].T_Venta
  2. SELECT Fecha, Cliente, Monto, ID_Venta
  3. FROM [DB_Cliente].[DBO].T_Venta

Ahora bien, se logra insertar normal tomando los campos que debe y creando el ID_VENTA automáticamente como debe. Ahora el problema es al hacer el INSERT de los detalles, ya que el ID_VENTA tiene que jalar los datos que se crraron automaticamente.
Código SQL:
Ver original
  1. INSERT [DB_Servidor].[DBO].T_Detalle
  2. SELECT Articulo, Monto
  3. /**En el select tengo que agregarle el ID_Venta, pero si lo hago jalara del cliente, cuando yo deseo que me jale los ID_Venta del  servidor los cuales se crearon cuando hice el primer INSERT.**/
  4. FROM [DB_Cliente].[DBO].T_Detalle


Sino me dejo entender avisenme por favor.

Saludos.
  #2 (permalink)  
Antiguo 03/08/2012, 14:53
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Dudas en INSERT

un trigger no te sirve? si se autogenera no te sirve @@identity?
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 03/08/2012, 15:05
Avatar de Agrevio  
Fecha de Ingreso: septiembre-2008
Ubicación: Perú
Mensajes: 80
Antigüedad: 15 años, 8 meses
Puntos: 2
Respuesta: Dudas en INSERT

Gracias por tu ayuda, y por lo que estoy leyendo sobre @@identity parece que si... Pero me podrías dar una idea por favor en base a ese ejemplo que puse arriba? Ya que no sabria como hacer el enlace para que jale el Identity creado en la otra base...

Saludos
  #4 (permalink)  
Antiguo 03/08/2012, 15:19
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Dudas en INSERT

Código SQL:
Ver original
  1. INSERT [DB_Servidor].[DBO].T_Venta
  2.     SELECT Fecha, Cliente, Monto, ID_Venta
  3.     FROM [DB_Cliente].[DBO].T_Venta
  4.  
  5.     INSERT [DB_Servidor].[DBO].T_Detalle
  6.     SELECT Articulo, Monto,@@IDENTITY
  7.     FROM [DB_Cliente].[DBO].T_Detalle

Asi??
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #5 (permalink)  
Antiguo 03/08/2012, 15:30
Avatar de Agrevio  
Fecha de Ingreso: septiembre-2008
Ubicación: Perú
Mensajes: 80
Antigüedad: 15 años, 8 meses
Puntos: 2
Respuesta: Dudas en INSERT

Cita:
Iniciado por Libras Ver Mensaje
Código SQL:
Ver original
  1. INSERT [DB_Servidor].[DBO].T_Detalle
  2.     SELECT Articulo, Monto,@@IDENTITY
  3.     FROM [DB_Cliente].[DBO].T_Detalle

Asi??
Creo que no...

Ya que ese @@Identity deberia de jalar pero de la base DB_Servidor y alli esta jalando de la base DB_Cliente de la tabla T_Venta.... o me equivoco?

Código SQL:
Ver original
  1. INSERT [DB_Servidor].[DBO].T_Detalle
  2.     SELECT  @@IDENTITY, Articulo, Monto
  3.     FROM [DB_Cliente].[DBO].T_Detalle
  4.     WHERE @@IDENTITY = [DB_Servidor].[DBO].[T_Venta].ID_Venta

seria algo asi ?

Disculpa si no puedo ondar más, pero se poco de SQL...

Saludos.

Última edición por Agrevio; 03/08/2012 a las 15:36
  #6 (permalink)  
Antiguo 03/08/2012, 20:26
Avatar de matanga  
Fecha de Ingreso: octubre-2007
Ubicación: España
Mensajes: 1.091
Antigüedad: 16 años, 6 meses
Puntos: 85
Respuesta: Dudas en INSERT

No comentas mucho sobre cuál es el objetivo de pasar los datos de una base a la otra, pero si el campo ID_Venta es la clave que define la relación entre T_Venta y T_Detalle en la base DB_Cliente, entonces no deberías cambiar su valor al pasar los datos a DB_Servidor, es decir, el campo ID_Venta en DB_Servidor no debería ser identity.

Dicho esto, tienes dos formas de pasar los datos con ID_Venta autoincremental manteniendo la relación entre las tablas (los ejemplos son pseudocódigo):

1. Un cursor más las funciones @@identity, scope_identity() o ident_current().

Código:
declare cur_t_venta cursor for 
 select * from db_cliente.dbo.t_venta
declare @fecha datetime
declare @cliente varchar
declare @monto int
declare @id_venta int

fetch next from cur_t_venta
 into @fecha, @cliente, @monto, @id_venta
while @@fetch_status=0
begin
 insert into db_servidor.dbo.t_venta
 values (@fecha, @cliente, @monto)
 
 insert into db_servidor.dbo.t_detalle
 select articulo, monto, @@identity
 from db_cliente.dbo.t_detalle
 where id_venta = @id_venta

 fetch next from cur_t_venta
  into @fecha, @cliente, @monto, @id_venta
end
2. Un insert..select con un campo auxiliar más un update.

Código:
alter table db_servidor.dbo.t_venta add id_venta_original int

insert into db_servidor.dbo.t_venta 
 (fecha, cliente, monto, id_venta_original)
select fecha, cliente, monto, id_venta
from db_cliente.dbo.t_venta

insert into db_servidor.dbo.t_detalle
select articulo, monto, id_venta
from db_cliente.dbo.t_detalle

update db_servidor.dbo.t_detalle
set t_detalle.id_venta = t_venta.id_venta
from db_servidor.dbo.t_venta
where t_detalle.id_venta = t_venta.id_venta_original

alter table db_servidor.dbo.t_venta drop id_venta_original
Saludos
  #7 (permalink)  
Antiguo 04/08/2012, 15:53
Avatar de Agrevio  
Fecha de Ingreso: septiembre-2008
Ubicación: Perú
Mensajes: 80
Antigüedad: 15 años, 8 meses
Puntos: 2
Respuesta: Dudas en INSERT

Hola Matanga,

Gracias por el interes, pero parece que no es lo que busco.

En el siguiente grafico, deseo mostrar como e que tiene que quedar la data...

Yo insertaré la data de TB_CLIENTE (ambas tablas) y la subire a DB_Servidor (ambas tablas).

Como podrán ver en la imagen la tabla T_Detalle tiene en el campo ID_Venta, el dato jalado de la tabla T_Venta que se autogenero cuando hice el insert de la tabla T_Venta.

Ese es mi duda, como se haria para que a la hora de hacer el INSERT desde el cliente en la tabla T_Detalle indicarle que jale el ID_Venta de la tabla T_Venta del servidor.



alguna otra duda, porfavor no duden en preguntar.
  #8 (permalink)  
Antiguo 06/08/2012, 08:22
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Dudas en INSERT

y porque tienen que existir ids diferentes entre server y cliente, porque no son los mismos???
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #9 (permalink)  
Antiguo 06/08/2012, 10:38
Avatar de Agrevio  
Fecha de Ingreso: septiembre-2008
Ubicación: Perú
Mensajes: 80
Antigüedad: 15 años, 8 meses
Puntos: 2
Respuesta: Dudas en INSERT

Hola libras,

Pues asi esta creada la DB, es de un programa y como ya no se utiliza, necesito pasar toda la data al DB_servidor, además no es solo una DB_cliente sino que son muchas. Yo solo puse una como ejemplo, ya que para los demás será lo mismo.

Gracias por el apoyo, saludos.
  #10 (permalink)  
Antiguo 06/08/2012, 10:40
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Dudas en INSERT

por eso sea una o sean muchas porque no pasas los datos iguales? porque la necesidad de que cada tabla tenga id's diferentes? Si en tu tabla cliente va en el registro num 20 al insertar en la tabla server tus registros continuaran en el 21 asi que para que tener id's diferentes?
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #11 (permalink)  
Antiguo 06/08/2012, 10:46
Avatar de Agrevio  
Fecha de Ingreso: septiembre-2008
Ubicación: Perú
Mensajes: 80
Antigüedad: 15 años, 8 meses
Puntos: 2
Respuesta: Dudas en INSERT

Pues, eso tendria que preguntarle a los desarrolladores.

Ejemplo, tengo 3 clientes los cuales hicieron sus primeras ventas:
  • Cliente 1, Id_Venta: 1 , 2 y 3
  • Cliente 2, Id_Venta: 1 , 2 y 3
  • Cliente 3, Id_Venta: 1 , 2 y 3
Entonces ese ID no puede pasar al Servidor, ya que los ID son autogenerados y no se pueden repetir, por ende los ID serían 1,2,3,4,5,6,7,8,9 respectivamente.

Ahora por ejemplo, en mi cliente en la tabla T_Venta estoy en el ID 1500 y en el servidor en la tabla T_Venta estoy en el ID 15700.

Me dejo entender?

Saludos.
  #12 (permalink)  
Antiguo 06/08/2012, 10:48
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Dudas en INSERT

lo sabia :) ese era el issue que al momento de hacer tus inserts en la tabla server se te mueven los "identity" right? bueno eso lo solucionas asi:

Código SQL:
Ver original
  1. SET IDENTITY_INSERT new_table ON
  2.  
  3. INSERT INTO new_table (VALUES)
  4. SELECT  VALUES
  5. FROM old_table
  6.  
  7. SET IDENTITY_INSERT new_table OFF

saludos!
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #13 (permalink)  
Antiguo 06/08/2012, 11:02
Avatar de Agrevio  
Fecha de Ingreso: septiembre-2008
Ubicación: Perú
Mensajes: 80
Antigüedad: 15 años, 8 meses
Puntos: 2
Respuesta: Dudas en INSERT

Cita:
Iniciado por Libras Ver Mensaje
lo sabia :) ese era el issue que al momento de hacer tus inserts en la tabla server se te mueven los "identity" right? bueno eso lo solucionas asi:

Código SQL:
Ver original
  1. SET IDENTITY_INSERT new_table ON
  2.  
  3. INSERT INTO new_table (VALUES)
  4. SELECT  VALUES
  5. FROM old_table
  6.  
  7. SET IDENTITY_INSERT new_table OFF

saludos!
Gracias por responder Libras,

pero aun no entiendo como se relacionaria, o es que seria asi?

Código SQL:
Ver original
  1. SET IDENTITY_INSERT [DB_Servidor].[DBO].T_Venta ON
  2.  
  3. INSERT [DB_Servidor].[DBO].T_Detalle
  4. SELECT ID_Venta, Articulo, Monto
  5. FROM [DB_Cliente].[DBO].T_Detalle
  6.  
  7. SET IDENTITY_INSERT [DB_Servidor].[DBO].T_Venta OFF

Ya que tendría que jalas los ID_Venta creados en el servidor, y como hago para relacionar los detalles a las ventas, como le indico al query que detalle pertenece a que cabecera.?

Saludos
  #14 (permalink)  
Antiguo 06/08/2012, 11:19
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Dudas en INSERT

exportas las 2 tablas no?? asi tambien te llevas las relaciones......
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #15 (permalink)  
Antiguo 06/08/2012, 11:28
Avatar de Agrevio  
Fecha de Ingreso: septiembre-2008
Ubicación: Perú
Mensajes: 80
Antigüedad: 15 años, 8 meses
Puntos: 2
Respuesta: Dudas en INSERT

Cita:
Iniciado por Libras Ver Mensaje
exportas las 2 tablas no?? asi tambien te llevas las relaciones......
hola Libras, pues estuve buscando info sobre IDENTITY_INSERT y este sirve para poder permitir modificar y/o agregar los campos IDENTITY cierto.

Pues no es lo que necesito, aunque te agradesco hacerme conocer una nueva herramienta....

-lo que necesito es.

1. Hago insert de [t_cliente].[dbo].t_venta a [db_servidor].[dbo].t_venta
2. En [db_servidor].[dbo].t_venta se crea nuevos identity (ID_Venta)
3. Tengo que hacer el insert de [t_cliente].[dbo].t_detalle a [db_servidor].[dbo].t_detalle pero este detalle tiene que tener el ID_Venta que se creo en [db_servidor].[dbo].t_venta.
Como hago esa relacion, para insert el ID_Venta creado?

En la imagen esta más claro creo. Si te das cuenta las tablas está relacionadas por ID_Venta, pero en el servidor cambia un poco...

Saludos.
  #16 (permalink)  
Antiguo 06/08/2012, 11:55
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Dudas en INSERT

un trigger :) no queda de otra
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #17 (permalink)  
Antiguo 06/08/2012, 12:11
Avatar de Agrevio  
Fecha de Ingreso: septiembre-2008
Ubicación: Perú
Mensajes: 80
Antigüedad: 15 años, 8 meses
Puntos: 2
Respuesta: Dudas en INSERT

Cita:
Iniciado por Libras Ver Mensaje
un trigger :) no queda de otra
me podrías indicar como en base a esas tablas que puse como ejemplo?, pasa que nunca hice un trigger y nose como se usa...

Espero me ayudes hermano. Saludos.
  #18 (permalink)  
Antiguo 06/08/2012, 12:36
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Dudas en INSERT

create trigger after insert [db_servidor].[dbo].t_venta
as
insert into [db_servidor].[dbo].t_detalle
select dato1,dato2,dato3,(select autoid from inserted) from [t_cliente].[dbo].t_detalle




algo asi? y busca como se hace un trigger :)
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me

Etiquetas: dudas, insert, select, campos
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 19:05.