2016-02-25 5 views
0

Я изменил таблицу из базы данных разработки и хочу обновить ту же таблицу в производственной базе данных новыми данными с сервера разработки. Пожалуйста, дайте мне это объяснить ...SQL Server 2008: обновление таблицы с помощью первичного ключа

Например,

Таблица развития:

TableName: ParentTable (ParentID является автоматическое приращение # и первичный ключ)

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 

стол Производство:

Имя Стола: ParentTable (ParentID - auto increment # и первичный ключ)

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 и другими.

На сервере DEV я сменил имя с «A» на «Z» на parentID# 1, а также удалил запись для parentID# 2.

С parentID# 2 запись была удалена на сервере DEV, предположим, что я удалю любые записи из других таблиц, связанных ParentID# 2 на производственном сервере.

Что такое хороший способ обновить ParentTable при производстве, который выглядит точно так же, как ParentTable на сервере DEV?

Заранее спасибо

+0

Это одноразовое обновление или это постоянная/мгновенная потребность? –

+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

Смежные вопросы