¿Como copiar los datos de una tabla de una base de datos en otra base de datos con una tabla idéntica?

publicado por: Anonymous

Saludos a todos, amigos. Tengo el siguiente problema:

Acabo de asumir la administración de un antiguo sistema el cual maneja 4 bases de datos (nombres distintos, estructura idéntica) pero la única tabla común en estructura y datos es la de Usuarios.

El sistema según me informan tiene una tarea que toma la tabla de una de las bases de datos como principal y la replica en las otras 3 :S, esta tarea está fallando y el sistema esta caído… :$

Si bien debo buscar en que parte de ese horrible código esta dicha tarea, me urge hacer la replica de las tablas de forma manual vía SQL Server.

He intentado esto:

UPDATE [BDdestino].[dbo].[Usuarios]

SET
[DBdestino].[dbo].[Usuarios].activo = [Usuarios].activo,
[DBdestino].[dbo].[Usuarios].apellido = [Usuarios].apellido,
[DBdestino].[dbo].[Usuarios].cargo = [Usuarios].cargo,
[DBdestino].[dbo].[Usuarios].correo = [Usuarios].correo,
[DBdestino].[dbo].[Usuarios].nombre = [Usuarios].nombre,
[DBdestino].[dbo].[Usuarios].password = [Usuarios].password,
[DBdestino].[dbo].[Usuarios].usuario_id = [Usuarios].usuario_id

FROM [DBorigen].[dbo].[Usuarios]

Pero me da este error:

Msg 1013, Level 16, State 1, Line 2 Los objetos
“DBdestino.dbo.Usuarios” y “DBorigen.dbo.Usuarios” en la cláusula FROM
tienen los mismos nombres expuestos. Use nombres de correlación para
distinguirlos.

solución

Si quieres hacer una réplica de los datos de una tabla usando SQL, en realidad una sentencia UPDATE no te conviene, porque tal vez tengas registros de más o menos en ambas tablas, y en esos casos, el UPDATE no te ayudará.

Mas bien, una opción es borrar todos los datos y volver a insertar todos los datos de tu tabla fuente:

delete from [BDdestino].[dbo].[Usuarios];

insert into [BDdestino].[dbo].[Usuarios] select * from [DBorigen].[dbo].[Usuarios];

Si es posible, en vez del DELETE, pudieras optar por usar un TRUNCATE TABLE si deseas.

En cualquier caso, si tu tablas contiene una columna identity (usuario_id?), necesitarás correr la sentencia siguiente antes de hacer el INSERT:

set identity_insert [BDdestino].[dbo].[Usuarios] on;

Otra opción que puede que sea más eficiente es usar un MERGE, que básicamante se encarga de hacer los INSERT, UPDATE, DELETE necesarios para que tu tabla de destino se convierta en una réplica de tu tabla fuente. Puede ser más eficiente si la mayoría de los registros ya concuerdan entre las 2 tablas:

merge into [BDdestino].[dbo].[Usuarios] as dest
using [DBorigen].[dbo].[Usuarios] as src
   on src.usuario_id = dest.usuario_id
when matched then 
  update set dest.activo = src.activo,
             dest.apellido = src.apellido,
             dest.cargo = src.cargo,
             dest.correo = src.correo,
             dest.nombre = src.nombre,
             dest.password = src.password
when not matched then 
  insert (usuario_id, activo, apellido, cargo, correo, nombre, password)
  values (src.usuario_id, src.ctivo, src.apellido, src.cargo, src.correo, src.nombre, src.password)
when not matched by source then delete;

Con el MERGE también, si tu columna usuario_id es una columna identity, necesitarás ejecutar le sentencia siguiente antes del MERGE:

set identity_insert [BDdestino].[dbo].[Usuarios] on;
Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *