2010-07-06 79 views
1

我正在處理一個數據倉庫項目,其中有多個系統正在將數據加載到暫存區域以供後續處理。每個表都有一個「loadId」列,它是針對「加載」表的外鍵,其中包含諸如加載時間,用戶帳戶等信息。SQL Server:批量加載的唯一鍵

當前,源系統調用存儲過程獲取新的loadId,將loadId添加到將要插入的每一行,然後調用第三個sproc來指示加載完成。

我的問題是,有沒有辦法避免必須將loadId傳遞迴源系統?例如,我在想象我可以從Sql Server獲得某種連接Id,我可以使用它在load表中查找相關的loadId。但我不確定Sql Server是否有一個連接唯一的變量?

有誰知道嗎?

感謝,

回答

0

我假設源系統正在編寫/犯插入到你的源表和多個載荷不會在同一時間運行...

如果是這樣,有源負載調用存儲過程,newLoadStarting(),在s之前負責處理加載過程。這個存儲過程會更新一個加載表(創建一個新行,記錄開始時間)

在您的loadID列上放置一個觸發器,該表將從此表中獲取max(loadID)並插入爲當前加載ID。

爲了完整起見,您可以添加一個endLoading()proc,它設置結束日期並取消激活該特定負載。

如果您正在運行多個負載在同一表在同一時間...停止這樣做......這不是非常有成效的。

+0

這幾乎是我最後想到的,但通過鎖定表足夠了,我不再需要loadStarting sproc。 – 2010-08-23 09:59:38

+0

很高興我能幫到你 – Markus 2010-09-03 14:29:59

0

本地臨時表(用一個井號#TEMP)是唯一的會話,轉儲ID在那裏,然後從中選擇

順便說一句,這隻會如果使用工作相同的連接

+0

我想到了這一點,但臨時表實際上是在它們超出範圍時被丟棄的。當創建它們的存儲過程完成時,它們超出範圍。所以數據會丟失。 – 2010-07-06 17:41:14

+0

你需要在proc調用之前創建它們,然後調用procs ..我不知道你的過程如何工作,所以這可能不適合你 – SQLMenace 2010-07-06 17:52:48

0

最後,我去了以下解決方案「模式」,非常類似於馬庫斯是在暗示:

  • 我創建了一個表,一個loadId列,默認爲空(加上一些其他審計信息像createdDate和createdByUser);
  • 我在隱藏loadId和audit列的表上創建了一個視圖,只顯示了其中loadId爲null的行;
  • 源系統加載/查看數據到視圖中,而不是表格;
  • 完成後,源系統會調用一個「sp__loadFinished」過程,該過程將正確的值放入loadId列並執行一些其他日誌記錄(接收的行數,日期調用等)。我從一個模板生成它,因爲它是重複的。

因爲loadId現在對所有這些行都有一個值,所以它不再對源系統可見,並且如果需要它可以啓動另一個負載。

我還爲每個源系統安排了自己的模式,這是它可以看到的唯一東西,也是它在登錄時的默認模式。該視圖和sproc位於此架構中,但基礎表處於包含跨所有源的數據的「分段」架構中。我確保通過命名約定不會發生衝突。

工程像一個魅力,包括一個情況下,如果兩個表已被更新只能完成加載。

相關問題