web-dev-qa-db-fra.com

Comment mettre à jour les données d'une table à partir des données correspondantes d'une autre table dans SQL Server 2005

J'ai deux tables dans différentes bases de données sur le même serveur de base de données.

Les deux bases de données ont la même structure, mais des données différentes. Database1 (Test1) est la dernière, et database2 (Test2) est une ancienne copie de la base de données.

  • Test1 a une table appelée Employee avec 3000 enregistrements
  • Test2 a une table appelée Employee avec 1000 enregistrements

Je dois mettre à jour la table dans Test1 à partir de la même table dans Test2 pour une colonne particulière appelée DeptID, car les valeurs de la table Employee de la base de données Test2 (l'ancienne) ont été mises à jour. J'ai donc besoin de mettre à jour la table dans la nouvelle base de données à partir de la table de l'ancienne base de données, qui compte environ 1000 lignes.

En d'autres termes, je dois mettre à jour la colonne DeptID de la table Employee de la base de données Test1 avec les valeurs que j'ai dans la colonne DeptID de la table Employee de la base de données Test2

Je sais que je peux restaurer la base de données elle-même, mais ce n'est pas une solution. Je dois mettre à jour les valeurs de la base de données Test1 à partir de la base de données Test2.

47
happysmile

Si les deux bases de données se trouvent sur le même serveur, vous devriez pouvoir créer une instruction SQL de la manière suivante:

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

De votre message, je ne sais pas très bien si vous voulez mettre à jour Test1.dbo.Employee avec les valeurs de Test2.dbo.Employee (c'est ce que fait ma requête), ou l'inverse (puisque vous avez mentionné la base de données sur Test1 était la nouvelle table ......)

138
marc_s
update t2
set t2.deptid = t1.deptid
from test1 t1, test2 t2
where t2.employeeid = t1.employeeid
14
Sachin Shanbhag
UPDATE table1
SET column1 = (SELECT expression1
               FROM table2
               WHERE conditions)
[WHERE conditions];
2
betrice mpalanzi
update test1 t1, test2 t2
set t2.deptid = t1.deptid
where t2.employeeid = t1.employeeid

vous ne pouvez pas utiliser de mot-clé pour le mysql

1
swamy

Essayez une requête comme

INSERT INTO NEW_TABLENAME SELECT * FROM OLD_TABLENAME;
1

cela fonctionne à merveille - pas à son tour d'appeler ce code de formulaire de procédure avec DataTable avec un schéma correspondant exactement au custType créer un client de table ( id int identité (1,1) clé primaire, nom 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);
                }
            }
}
0
yudhi