gpt4 book ai didi

sql-server - 在具有不同名称且具有不同列名的两个表之间进行复制。是否有可能创建这样的复制

转载 作者:行者123 更新时间:2023-12-04 00:04:48 25 4
gpt4 key购买 nike

我有一个要求,我在两个具有不同名称和不同列名的表之间创建复制。是否有可能创建这样的复制。

server A                                            server B
---------- ----------
Table : Test Table : SUBS
-------------- ---------------
columns A,B,C Columns D,E,F,G,H

我想配置复制,让A列数据复制到D列,B列数据复制到E列,C列数据复制到F列

最佳答案

显然,答案是:“当您定义文章时,您必须将 @vertical_partition 参数设置为 true,然后使用 sp_articlecolumn 。”

但是,我不得不问你为什么要这样做。在我看来,复制不是用于在不同数据库之间移动数据的通用工具,而是用于保持两个相同数据库同步的工具。

其他头脑 Storm 想法:

  • 您可以创建一个与目标表匹配的新源表,并使用触发器使源表保持同步。
  • 将源表原封不动地推送到目标,并在目标数据库中进行 MERGE。
  • 在这里,复制可能并不是真正正确的解决方案。要求完成此操作的业务规则和要求是什么?您是否考虑过使用 SSIS?
  • 如果需要两个表始终精确同步,那么更改源表的 channel 是什么——应用程序?这听起来几乎像是您的应用程序需要一个新的抽象级别,一个知道如何同时写入两个源的数据写入层。

试图在两个不同的数据库之间保持数据同步可能是一个问题。可能存在竞争条件的各种微妙问题,缺少分布式事务(影响一致性和对故障的响应),为处理没有分布式事务而创建的变通方法的问题,等等。您是否可以创建一个链接服务器和一些 View ,使一个数据库中的数据可以从另一个实时访问?

请告诉我们更多关于您的要求以及您需要这样做的原因。

更新

如果您要采用手动更新路线,请注意您不能批量应用时间段的插入、更新和删除操作。您必须按顺序一次应用它们。如果您使用当前状态 而不是中间数据操作,那么您可以同时处理所有行。我将向您展示 MERGE 示例,而不是历史回放示例。

BEGIN TRAN;

DELETE D
FROM LinkedServer.dbo.Dest D WITH (TABLOCKX, HOLDLOCK)
WHERE
NOT EXISTS (
SELECT *
FROM Source S
WHERE D.Key = S.Key
);

UPDATE D
SET
D.Col1 = S.Col4,
D.Col2 = S.Col5,
D.Col3 = S.Col6,
D.Col4 = S.Col7,
FROM
LinkedServer.dbo.Dest D
INNER JOIN Source S ON D.Key = S.Key
WHERE
D.Col1 <> S.Col4
OR EXISTS (
SELECT D.Col2, D.Col4
EXCEPT
SELECT S.Col3, S.Col6
); -- or some other way to handle comparison of nullable columns

INSERT LinkedServer.dbo.Dest (Col1, Col2, Col3)
SELECT Col4, Col5, Col6
FROM Source S WITH (TABLOCK, HOLDLOCK)
WHERE
NOT EXISTS (
SELECT *
FROM LinkedServer.dbo.Dest D
WHERE S.Key = D.Key
);

COMMIT TRAN;

您可能会发现推送整个表并在目标服务器上进行合并操作会更好。

如果您要获得一致的时间点快照,我在第一个查询中输入的锁提示很重要。如果你不关心这个,那就把锁定提示去掉。

如果您发现链接服务器的更新速度很慢,则将整个表一起推送到远程服务器上的一个临时暂存表,并在脚本中完全在远程服务器上执行 MERGE。

关于sql-server - 在具有不同名称且具有不同列名的两个表之间进行复制。是否有可能创建这样的复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5700047/

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