2016-02-25 117 views
0

我修改了开发数据库中的表,并希望使用开发服务器中的新数据更新生产数据库上的同一个表。请让我来解释一下这个...SQL Server 2008:使用主键更新表

例如,

发展表:

表名:ParentTableParentID是自动递增#和主键)

ParentID  Name Value 
------------------------------ 
1    Z  A-1 (change value to Z) 
2    B  B-1 (will delete the record completely) 
3    C  C-1 
4    D  D-1 
5    E  E-1 
6    F  F-1 
7    G  G-1 
8    H  H-1 
9    I  I-1 

生产表:

表名:ParentTableParentID是自动递增#和主键)

ParentID  Name Value 
----------------------------- 
1    A  A-1 
2    B  B-1 
3    C  C-1 
4    D  D-1 
5    E  E-1 
6    F  F-1 
7    G  G-1 
8    H  H-1 
9    I  I-1 

首先,请注意ParentID是自动递增#并且也是主键。 ParentTable与其他人之间也有关系。

在开发服务器,我从“A”更名为“Z”与parentID# 1,而我也删除了记录parentID# 2

由于parentID# 2记录已被开发服务器上删除,以为我会从生产服务器上的相关ParentID# 2其他表中删除任何记录。

什么是对生产更新ParentTable一个很好的方式,看起来为ParentTable开发服务器上的完全一样?

在此先感谢

+0

这是一次性更新还是这是持续性/即时性需求? – 2016-02-25 21:29:57

+0

只有一次更新。谢谢 – Milacay

回答

1

假设两个数据库位于同一台服务器(或链接服务器)上。你可以做一个MERGE查询。如果不是,您可以使用UPDATE查询更新值。

MERGE INTO ProductionDB.Schema.ParentTable A 
USING DevelopmentDB.Schema.ParentTable B 
ON A.ParentID = B.ParentID 
WHEN MATCHED THEN 
UPDATE SET A.Name = B.Name, A.Value = B.Value; 

当然要替换你的服务器/数据库名称。但这是你正在寻找的一个粗略例子。

+0

对不起,数据库位于不同的服务器上,但我已经创建了LinkedServer。我还可以使用MERGE吗? – Milacay

+0

是的。这也应该在链接服务器上工作。只要你可以参考两个表。 – ale8oneboy

+0

您可以根据我发布的这两张表格为我提供示例吗?我担心在维修之夜我无法弄清楚。谢谢。 – Milacay

1

我可能会尝试一些像:

declare @parentOffset int 
begin transaction 

select @parentOffset = max(ParentID) from Prod.dbo.ParentTable (holdlock) 

set identity_insert Prod.dbo.ParentTable on 

insert into Prod.dbo.ParentTable (ParentID , Name , Value) 
select Dev.dbo.ParentTable.ParentID + @parentOffset , Dev.dbo.ParentTable.Name , Dev.dbo.ParentTable.Value 
from Dev.dbo.ParentTable.ParentTable 

set identity_insert Prod.dbo.ParentTable off 

insert into Prod.dbo.ChildTable (ParentID , SomeOtherField) 
select Dev.dbo.ChildTable.ParentID + @parentOffset , Dev.dbo.ChildTable.SomeOtherField 

commit transaction 

显然,测试它反对的东西脱机副本你扣动扳机在生产之前,并会提出一些错误处理,但这应该得到工作完成。它不会测试以查看表中是否已有值,但您可以通过临时表进行稍微修改&。目前还不清楚这是你的情况,还是你只是想补充。

+0

非常感谢你提供的例子。这对我行得通。我将创建另一个表并首先对其进行脱机测试。 – Milacay