在SQL Server中的两个表之间协调列

时间:2008-10-18 02:27:11

标签: sql sql-server

有两个数据库,数据库A有一个表A,其中包含id,group和flag列。数据库B有一个表B,其中包含ID和标志列。表B基本上是表A where the group == 'B'的子集。

它们以奇怪的方式更新/创建,目前我的理解范围之外,并且超出了这个问题的范围(现在不是修复此客户端的基本设置和实践的时候)。

问题是当表A中的标志更新时,它不会反映在表B中,但应该是。这不是一个时间紧迫的问题,因此建议我创建一个工作来处理这个问题。也许是因为这是一周的结束,或者因为我从来没有写过最基本的存储过程(我是程序员,而不是DBA),但我不知道该怎么做。

在简单的层面上,存储过程将是

的行
Select * in table A where group == B

然后,遍历resultset,并为每个id更新标志。

但我甚至不确定如何像这样循环stored procedure。建议?示例代码将是首选。

并发症:好吧,这也有点困难。对于每个组,表B都在一个单独的数据库中,我们需要为所有组更新此标志。因此,我们必须为每个组设置一个单独的触发器来处理每个数据库名称。

是的,已经处理了对表B的插入 - 这只是为了更新标志状态。

4 个答案:

答案 0 :(得分:2)

假设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中的临时表等,然后使用临时表运行此查询。

答案 1 :(得分: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。

注意您可以在没有[]的情况下使用Flag。我只是因为stackoverflow上的语法着色而使用括号。

答案 2 :(得分:0)

How can one iterate over stored procedure results from within another stored procedure....without cursors?似乎有一个类似的问题,但它停止了我想要完成的步骤。

答案 3 :(得分:0)

在表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的更新。

相关问题