有两个数据库,数据库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的插入 - 这只是为了更新标志状态。
答案 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的更新。