在 SQL Server 中跨两个表协调列
Posted
技术标签:
【中文标题】在 SQL Server 中跨两个表协调列【英文标题】:Reconciling a column across two tables in SQL Server 【发布时间】:2008-10-18 02:27:10 【问题描述】:有两个数据库,数据库 A 有一个表 A,其中包含 id、group 和 flag 列。数据库 B 有一个表 B,其中包含 ID 和标志列。表 B 本质上是表 A where the group == 'B'
的子集。
它们是以我目前无法理解的奇怪方式更新/创建的,并且超出了这个问题的范围(现在不是修复这个客户的基本设置和实践的时候)。
问题是表A中的flag更新时,并没有反映在表B中,而是应该的。这不是一个时间紧迫的问题,所以建议我创建一个工作来处理这个问题。可能是因为现在是周末,也可能是因为我只写过最基本的存储过程(我是程序员,不是 DBA),但我不知道该怎么做。
简单来说,存储过程类似于
Select * in table A where group == B
然后,循环遍历resultset
,并为每个 id 更新标志。
但我什至不确定如何像这样循环输入stored procedure
。建议?示例代码将是首选。
复杂性:好吧,这也变得有点困难。对于每个组,表 B 都在一个单独的数据库中,我们需要为所有组更新这个标志。因此,我们必须为每个组设置一个单独的触发器来处理每个数据库名称。
是的,已经处理了对表 B 的插入 - 这只是为了更新标志状态。
【问题讨论】:
***.com/questions/149132/… 似乎有一个类似的问题,但它离我想要完成的目标还有一步之遥。 我刚刚重新阅读了链接的问题;您如何描述您的情况缺少的下一步?您是否在问如何使用游标(链接问题中不允许使用游标)?这个问题的规模是多少,即表A中有多少行? 目前为 200 万。我希望这也是每年添加的行数。 至于下一步,我可能只是想多了。你的回答可能会奏效。明天服务器管理员醒来时我会知道的。 由于我不知道的原因,这不再被追求 - 所以我不能确定什么是最好的答案,因为它从未实施过。对不起。 【参考方案1】:假设 ID 是唯一键,并且您可以使用链接服务器或其他类似的服务器跨服务器运行查询,则此 SQL 语句应该有效(它适用于同一服务器上的两个表)。
UPDATE Table_B
SET Table_B.Flag = Table_A.Flag
FROM Table_A inner join Table_B on Table_A.id = Table_B.id
(由于 Table_B 已经包含 Table_A 中 group = B 的行子集,因此我们不必在查询中包含此条件)
如果您不能使用链接服务器,那么我可能会尝试使用某种 SSIS 包来实现。或者我会使用linked question (comments, above)中描述的方法将数据库A中的相关数据获取到数据库B中的临时表等中,然后使用临时表运行此查询。
【讨论】:
【参考方案2】:UPDATE
DatabaseB.dbo.Table_B
SET
DatabaseB.dbo.Table_B.[Flag] = DatabaseA.dbo.Table_A.Flag
FROM
DatabaseA.dbo.Table_A inner join DatabaseB.dbo.Table_B B
on DatabaseA.dbo.id = DatabaseB.dbo.B.id
并发症: 对于多个组,每个组运行一个这样的更新 SQL。
请注意,您可以使用不带 [] 的标志。我使用方括号只是因为 *** 上的语法着色。
【讨论】:
【参考方案3】:在表 A 上创建一个更新触发器,在修改 A 时将必要的更改推送到 B。
基本上(语法可能不正确,我现在无法检查)。我似乎记得插入的表包含更新时的所有更新行,但您可能需要检查以确保。不过,我认为触发器是要走的路。
create trigger update_b_trigger
on Table_A
for update
as
begin
update Table_B
set Table_B.flag = inserted.flag
from inserted
inner join Table_B
on inserted.id = Table_B.id
and inserted.group = 'B'
and inserted.flag <> Table_B.flag
end
[编辑] 我假设对表 B 的插入/删除已经处理,它只是对表 B 的标记更新需要解决。
【讨论】:
好的,这似乎适用于所做的任何新更新,但数据库现在不同步。此外,创建 20-30 个触发器(每个组/数据库一个)会产生性能问题吗?以上是关于在 SQL Server 中跨两个表协调列的主要内容,如果未能解决你的问题,请参考以下文章
如何将两个表与 SQL Server 中第二个表中引用同一列的两列连接起来