Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2005 如何在SQLServer2005中从另一个表中的相应数据更新一个表中的数据_Sql Server 2005 - Fatal编程技术网

Sql server 2005 如何在SQLServer2005中从另一个表中的相应数据更新一个表中的数据

Sql server 2005 如何在SQLServer2005中从另一个表中的相应数据更新一个表中的数据,sql-server-2005,Sql Server 2005,我在同一数据库服务器上的不同数据库中有两个表 这两个数据库的结构相同,但数据不同。Database1(Test1)是最新的,database2(Test2)是数据库的旧副本 Test1有一个名为Employee的表,其中包含3000条记录 Test2有一个名为Employee的表,其中包含1000条记录 我需要从Test2中的同一个表中为一个名为DeptID的特定列更新Test1中的表,因为test2db中的Employee表(旧表)中的值已经更新。因此,我需要更新新数据库中的表,而旧数据库

我在同一数据库服务器上的不同数据库中有两个表

这两个数据库的结构相同,但数据不同。Database1(Test1)是最新的,database2(Test2)是数据库的旧副本

  • Test1有一个名为
    Employee
    的表,其中包含3000条记录
  • Test2有一个名为
    Employee
    的表,其中包含1000条记录
我需要从Test2中的同一个表中为一个名为DeptID的特定列更新Test1中的表,因为test2db中的Employee表(旧表)中的值已经更新。因此,我需要更新新数据库中的表,而旧数据库中的表大约有1000行

换句话说,我需要用
Test1
DB中
Employee
表中
DeptID
列中
Test2
DB中
Employee
列中的任何值更新
DeptID


我知道我可以恢复数据库本身,但这不是一个解决方案。我需要从Test2数据库更新Test1数据库中的值。

如果两个数据库位于同一台服务器上,您应该能够创建如下SQL语句:

update t2
set t2.deptid = t1.deptid
from test1 t1, test2 t2
where t2.employeeid = t1.employeeid
UPDATE Test1.dbo.Employee
SET DeptID = emp2.DeptID
FROM Test2.dbo.Employee as 'emp2'
WHERE
   Test1.dbo.Employee.EmployeeID = emp2.EmployeeID
从你的帖子中,我不太清楚你是想
Test2.dbo.Employee
中的值更新
Test1.dbo.Employee
(这就是我的查询所做的),还是相反(因为你在
Test1
中提到的db是新表……)

您不能对mysql使用from关键字使用test1

insert into employee(deptid)从test2.dbo.employee中选择deptid

INSERT INTO NEW_TABLENAME SELECT * FROM OLD_TABLENAME;

这是一个奇迹——没有轮到使用模式与custType完全匹配的DataTable调用此过程表单代码 创建表客户 ( id int identity(1,1)主键, 名称varchar(50), cnt varchar(10) )


是否只更新两个表上的值?或者你希望这两张表是相同的?不幸的是,你的问题不清楚。我想你很难用英语清楚地表达你的问题,但不要绝望!你可以举一些例子来帮助它。从每个表中发布5-10行,解释什么应该成为什么,这可能足以让我们理解您想要实现的目标。出色!!很简单,而且很有效(除了我从emp2中删除了引号)。非常感谢!正是我想要的。在使用子查询之前,我已经这样做了,但我知道必须有一种更简单的方法。我只想补充一点,我只想根据另一个表中的相应值更新一个表中的记录子集,这可以通过在WHERE子句中添加一个条件来轻松完成,例如,
WHERE Test1.dbo.Employee.EmployeeID=emp2.EmployeeID和Test1.dbo.Employee.Department in('Sales','Marketing'))
但如果两个数据库都在不同的服务器上,我们该怎么办?唯一的区别是这个版本使用了t2的别名。这非常有效。出于某种原因,@marc_的回答不起作用。可能是因为别名周围有引号?问题说明了不同的数据库。你没有考虑到这一点。另外,答案已经有了一个有效的公认答案。此外,请查看查询的格式设置。看一看。问题不是插入新行,而是用另一个现有表更新现有表。
update test1 t1, test2 t2
set t2.deptid = t1.deptid
where t2.employeeid = t1.employeeid
INSERT INTO NEW_TABLENAME SELECT * FROM OLD_TABLENAME;
UPDATE table1
SET column1 = (SELECT expression1
               FROM table2
               WHERE conditions)
[WHERE conditions];
 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);
                }
            }
}