2011-02-07 24 views
45

Tengo dos tablas en diferentes bases de datos en el mismo servidor de base de datos.Cómo actualizar los datos en una tabla desde los datos correspondientes en otra tabla en SQL Server 2005

Ambas bases de datos tienen la misma estructura pero diferentes datos. Database1 (Test1) es la última y database2 (Test2) es una copia antigua de la base de datos.

  • Prueba1 tiene una tabla llamada Employee con 3000 registros
  • Prueba2 ha una tabla llamada Employee con 1000 registros

necesito para actualizar la tabla en Prueba1 de la misma tabla en Prueba2 para un particular, columna llamada DeptID, porque los valores en la tabla Employee en Test2 DB (el anterior) se han actualizado. Entonces necesito actualizar la tabla en la nueva base de datos de la tabla en la base de datos antigua que tiene alrededor de 1000 filas.

En otras palabras, es necesario que actualice la columna de la DeptID en la tabla EmployeeTest1 en el DB con lo que los valores que tengo en la columna de la DeptID en la tabla Employee en el Test2 DB.

Sé que puedo restaurar el DB en sí, pero eso no es una solución. Necesito actualizar los valores en la base de datos Test1 desde la base de datos Test2.

+0

¿Desea simplemente actualizar los valores que están en ambas tablas? o quieres que esas dos tablas sean idénticas? – Lamak

+0

Desafortunadamente, su pregunta no está clara. ¡Supongo que es difícil para ti expresar tu problema en inglés con claridad, pero no te desesperes! Puedes ayudarlo dando algunos ejemplos.Publique entre 5 y 10 filas de cada tabla, explique qué debe convertirse en qué, y eso puede ser suficiente para que comprendamos lo que está tratando de lograr. –

Respuesta

133

Si las dos bases de datos están en el mismo servidor, debe ser capaz de crear una instrucción SQL o menos así:

UPDATE Test1.dbo.Employee 
SET DeptID = emp2.DeptID 
FROM Test2.dbo.Employee as 'emp2' 
WHERE 
    Test1.dbo.Employee.EmployeeID = emp2.EmployeeID 

Desde su puesto, no estoy muy claro si desea a actualizaciónTest1.dbo.Employee con los valores de Test2.dbo.Employee (eso es lo que hace mi consulta), o al revés (ya se menciona la db en Test1 fue la nueva tabla ......)

+1

¡Excepcional! Simple, y funciona (excepto que eliminé las comillas de emp2). ¡Muchas gracias! – Chiramisu

+2

Exactamente lo que estaba buscando. Lo hice antes de usar subconsultas, pero sabía que tenía que haber una manera más simple. Solo quiero agregar que solo quería actualizar un subconjunto de registros en una tabla en función de los valores correspondientes en otra tabla, lo que se puede hacer fácilmente agregando una condición a la cláusula ** WHERE **, p. 'WHERE Test1.dbo.Employee.EmployeeID = emp2.EmployeeID AND Test1.dbo.Employee.Department IN ('Ventas', 'Marketing')' –

+1

¿Pero qué haremos si ambas bases de datos están en un servidor diferente? – yash

13
update t2 
set t2.deptid = t1.deptid 
from test1 t1, test2 t2 
where t2.employeeid = t1.employeeid 
+1

La única diferencia aquí es que esta versión usa un alias para t2. – Fandango68

+1

Esto funcionó muy bien. Por alguna razón, la respuesta de @marc_s no funcionó. Posiblemente debido a las comillas alrededor del nombre de alias? –

-1
UPDATE Employee SET Empid=emp3.empid 
FROM EMP_Employee AS emp3 
WHERE Employee.Empid=emp3.empid 
1
update test1 t1, test2 t2 
set t2.deptid = t1.deptid 
where t2.employeeid = t1.employeeid 

no se puede utilizar a partir de palabras clave para el mysql

-2

uso test1

de inserción en empleado (deptid) seleccione deptid de test2.dbo.employee

+0

La cuestión no es insertar una nueva fila PERO actualizar la tabla existente con otra tabla existente. – nanosoft

1

Pruebe una consulta como

INSERT INTO NEW_TABLENAME SELECT * FROM OLD_TABLENAME; 
+0

La pregunta indica diferentes bases de datos. No has tomado eso en cuenta. Además, la respuesta ya tiene una respuesta aceptada que funciona. Además, busque formatear su consulta. Eche un vistazo a [esto] (http://stackoverflow.com/help/formatting). – Bugs

2
UPDATE table1 
SET column1 = (SELECT expression1 
       FROM table2 
       WHERE conditions) 
[WHERE conditions]; 
0

esto funciona de maravilla - no es su turno de llamar este código de formulario procedimiento con DataTable con esquema coincidente exactamente el custType crear tabla de clientes ( Identificación identidad int (1,1) clave principal, nombre varchar (50), cnt varchar (10) )

create type custType as table 
(
ctId int, 
ctName varchar(20) 
) 

insert into customer values('y1', 'c1') 
insert into customer values('y2', 'c2') 
insert into customer values('y3', 'c3') 
insert into customer values('y4', 'c4') 
insert into customer values('y5', 'c5') 

declare @ct as custType 
insert @ct (ctid, ctName) values(3, 'y33'), (4, 'y44') 
exec multiUpdate @ct 

create Proc multiUpdate (@ct custType readonly) as begin 
update customer set Name = t.ctName from @ct t where t.ctId = customer.id 
end 

public DataTable UpdateLevels(DataTable dt) 
     { 
      DataTable dtRet = new DataTable(); 
      using (SqlConnection con = new SqlConnection(datalayer.bimCS)) 
      { 
       SqlCommand command = new SqlCommand(); 
       command.CommandText = "UpdateLevels"; 
       command.Parameters.Clear(); 
       command.CommandType = CommandType.StoredProcedure; 
       command.Parameters.AddWithValue("@ct", dt).SqlDbType = SqlDbType.Structured; 
       command.Connection = con; 
       using (SqlDataAdapter dataAdapter = new SqlDataAdapter(command)) 
       { 
        dataAdapter.SelectCommand = command; 
        dataAdapter.Fill(dtRet); 
       } 
      } 
} 
Cuestiones relacionadas