【问题标题】:Reconciling a column across two tables in SQL Server在 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 的插入 - 这只是为了更新标志状态。

【问题讨论】:

  • stackoverflow.com/questions/149132/… 似乎有一个类似的问题,但它离我想要完成的目标还有一步之遥。
  • 我刚刚重新阅读了链接的问题;您如何描述您的情况缺少的下一步?您是否在问如何使用游标(链接问题中不允许使用游标)?这个问题的规模是多少,即表A中有多少行?
  • 目前为 200 万。我希望这也是每年添加的行数。
  • 至于下一步,我可能只是想多了。你的回答可能会奏效。明天服务器管理员醒来时我会知道的。
  • 由于我不知道的原因,这不再被追求 - 所以我不能确定什么是最好的答案,因为它从未实施过。对不起。

标签: sql sql-server


【解决方案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。

    请注意,您可以使用不带 [] 的标志。我使用方括号只是因为 stackoverflow 上的语法着色。

    【讨论】:

      【解决方案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 个触发器(每个组/数据库一个)会产生性能问题吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-10
      • 2014-12-29
      相关资源
      最近更新 更多