经过多次摆弄后,我设法安装了正确的ODBC驱动程序并在SQL Server 2008上成功创建了一个链接服务器,通过它我可以从SQL服务器访问我的PostgreSQL数据库。
我正在使用以下形式的合并语句将PgSQL DB中某些表的所有数据复制到SQL Server中:
with mbRemote as
(
select
*
from
openquery(someLinkedDb,'select * from someTable')
)
merge into someTable mbLocal
using mbRemote on mbLocal.id=mbRemote.id
when matched
/*edit*/
/*clause below really speeds things up when many rows are unchanged*/
/*can you think of anything else?*/
and not (mbLocal.field1=mbRemote.field1
and mbLocal.field2=mbRemote.field2
and mbLocal.field3=mbRemote.field3
and mbLocal.field4=mbRemote.field4)
/*end edit*/
then
update
set
mbLocal.field1=mbRemote.field1,
mbLocal.field2=mbRemote.field2,
mbLocal.field3=mbRemote.field3,
mbLocal.field4=mbRemote.field4
when not matched then
insert
(
id,
field1,
field2,
field3,
field4
)
values
(
mbRemote.id,
mbRemote.field1,
mbRemote.field2,
mbRemote.field3,
mbRemote.field4
)
WHEN NOT MATCHED BY SOURCE then delete;
此语句完成后,本地(SQL Server)副本与远程(PgSQL服务器)完全同步。
关于这种方法的一些问题:
答案 0 :(得分:1)
如果您无法或不想使用像SSIS这样的工具,这看起来是一种合理的方法。
您可以检查匹配时的行,以检查是否发生了更改,例如:
when matched and mbLocal.field1 <> mbRemote.field1 then
如果您要检查多个列,这很多都很难处理,因此您可以添加一个检查列(例如LastUpdatedDate)以使其更容易。