2008-10-18 56 views
2

有兩個數據庫,數據庫A有一個包含id,組和列標誌的表A.數據庫B具有表B,其中具有ID和標誌的列。表B實質上是表A where the group == 'B'的子集。在SQL Server中協調跨兩個表的列

它們是以我目前不瞭解的奇怪方式更新/創建的,並且超出了此問題的範圍(這不是解決此客戶端的基本設置和實踐的時間)。

問題是,當表A中的標誌更新時,它不反映在表B中,而應該是。這不是一個時間關鍵的問題,所以有人建議我創建一個工作來處理這個問題。也許是因爲這是本週末,或者因爲我從來沒有寫過比最基本的存儲過程更多的東西(我是程序員,而不是DBA),但我不知道如何去做這件事。

在一個簡單的層面,存儲過程將沿着

Select * in table A where group == B 

線條的東西。然後,通過resultset循環,併爲每個ID,更新標誌。

但我甚至不知道如何循環在這樣的stored procedure。建議?示例代碼將是首選。

併發症:好吧,這也有點困難。對於每個組,表B都在單獨的數據庫中,我們需要爲所有組更新此標誌。所以,我們必須爲每個組設置一個單獨的觸發器來處理每個數據庫名稱。

是的,插入表B已經處理 - 這只是更新標誌狀態。

+0

似乎有一個類似的問題http://stackoverflow.com/questions/149132/how-can-one-iterate-over-stored-procedure-results-from-within-another-stored-pr,但它停止了我期望完成的步驟。 – 2008-10-18 02:41:47

+0

我只是重讀鏈接的問題;你會如何描述下一步它缺少的情況?你在問如何使用遊標(鏈接問題中不允許)?這個問題的規模是什麼,即表A中有多少行? – Matt 2008-10-18 04:02:31

回答

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,需要解決。

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 

(因爲表-B已經包含表-A行,其中組= 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 

併發症: 對於sevaral組,每組運行一次​​這樣的更新SQL。

請注意,您可以在沒有[]的情況下使用標誌。我只使用括號是因爲在stackoverflow上的語法着色。