2011-11-16 124 views
0

我們正在設計從MAS200等外部數據源導入我們的生產SQL Server 2005/2008數據庫的數據導入。源將成爲交易數據庫並且安全/隔離。我們需要保持我們的數據庫與源同步,因此需要定期進行數據同步。SQL Server數據導入

我們可以自由要求任何類型的源數據 - 比如以CSV,txt文件的形式,或者甚至將源數據放在另一個具有類似結構的SQL數據庫中。我們需要選擇導入數據的最佳方式 - 這將是定期的,可能會每小時或每天完成。

根據我的經驗,我相信在SQL數據庫中使用源數據可能是最好的入門方式。以下是對我們到目前爲止得出一個粗略的設計 -

  1. 定期源數據庫將在外部(不是我們的部分)填充
  2. 預處理:波蘭語源表數據(即修剪,查找) - 一般數據格式化&轉換
  3. 提取:創建一個CURSOR來遍歷記錄。我們計劃更新現有數據並插入新的數據,因此我們需要至少兩個CURSOR循環。
  4. 填充:內遊標循環記錄將更新/插入
  5. 後處理:同樣一些最後的潤色&查找映射(即更換ID代碼)
  6. 檢查:最後,運行一致性檢查表,以確保進口

數據總之,我們要打破在存儲過程中的步驟,然後創建一個SQL工作將遵循THOS的完整性逐一步驟。我知道有很多方法可以做到這一點,SSIS,數據導入嚮導等。但是我們需要保持它非常簡單,便於攜帶,對未來的更改不太依賴和靈活。

注:該數據將是巨大的 - 上一次我們有一個類似的設置花了幾分鐘的時間幾乎一樣20-25分鐘即可完成整個數據導入過程,所以我們定的每小時的數據導入。

謝謝。


更新#1: 據我所知,用MERGE命令似乎最好。但是如果我必須爲SQL Server 2005創建它?我相信它可以在2008年之後起作用。 我找到了一個鏈接 -

http://sqlserver-tips.blogspot.com/2006/09/mimicking-merge-statement-in-sql.html

任何其他的想法在2005年?

+1

如果您的數據是**巨大**,那麼請儘量避免**遊標! –

回答

2

對於項目3和4 - 如果你使用的是SQL Server 2008中考慮使用MERGE命令,而不是光標和循環

如果可能的話,保留源數據庫的不變的副本,那麼如果有任何問題數據處理可以更輕鬆地找出原因。

+1

+1絕對沒有理由在這裏使用遊標 – brian

+0

那麼我的CURSOR的替代品 - 我的意思是我必須遍歷記錄插入以及更新。在這種情況下如何使用批量插入?批量更新是不可能的,所以我必須循環! –

+0

你可以迭代哪個是RBAR。 CURSORS速度很慢,導致在最小時,行鎖。如果你想迭代,然後將值轉儲到帶有IDENTITY的臨時表中,然後執行WHILE @count <= @ max'並增加@ @ count或做一個WHILE EXIST(從@variableTable中選擇top 1 1) '並從表中刪除......或其他東西 – SQLMason

0

您是否考慮過使用SQL Server Integration Services?這聽起來像你的項目非常適合它。

我最近從事一個項目,從各種數據源(數據庫和文件)中提取數據,彙總並清理數據,然後將其推入關係SQL Server 2008數據庫。這在SSIS中非常簡單。

0

正如其他人所說,在這個過程中不需要使用遊標;我也同意SSIS可能比你想象的更適合這個(因爲它是可移植和可配置的)。但是,如果您想在T-SQL中執行此操作,那麼我會建議您將FETCH步驟替換爲以下類似的內容:

  1. 從您用來擦亮數據的登臺表中提取數據。
  2. 如果不能在2008年SQL用MERGE命令,你可以效仿同樣的事情用一個連接:

    --rows進行更新 SELECT * FROM 分期 JOIN目的地ON staging.ID = destination.ID

    --rows要插入 SELECT * FROM 分期 JOIN目的地ON staging.ID = destination.ID WHERE destination.ID IS NULL

容易心慌,沒有遊標。