gpt4 book ai didi

tsql - 从链接服务器传输表数据的更快方法

转载 作者:行者123 更新时间:2023-11-29 12:23:05 26 4
gpt4 key购买 nike

经过多次尝试,我成功安装了正确的 ODBC 驱动程序并成功地在 SQL Server 2008 上创建了一个链接服务器,通过它我可以从 SQL 服务器访问我的 PostgreSQL 数据库。

我正在使用采用以下形式的合并语句将 PgSQL 数据库中某些表中的所有数据复制到 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 服务器) 完全同步。

关于这种方法的几个问题:

  1. 精神正常吗?
  2. 令我震惊的是,更新将运行在本地行中未必更改的所有字段上。唯一的先决条件是本地和远程 id 字段匹配。是否有更细粒度的方法/方法来限制合并语句仅更新实际上已更改的行?

最佳答案

如果您不能或不想使用像 SSIS 这样的工具,这看起来是一个合理的方法。

您可以在 when matched 行上添加检查以检查是否发生了更改,例如:

when matched and mbLocal.field1 <> mbRemote.field1 then

如果您要检查多个列,那么这很多会很笨拙,因此您可以添加一个检查列(例如 LastUpdatedDate)以简化此操作。

关于tsql - 从链接服务器传输表数据的更快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2456617/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com