Sql-Server

循環遍歷表格或複制粘貼

  • February 21, 2020

我必須進行遷移,我應該從 40 個 Access 表中檢索數據,這些表應該包含幾個相同的列(但不是全部,架構不同)。為了簡單起見,我使用 SSMA 在 SQL Server 中轉換這些表。

它是通過 SSIS 遷移的一部分。我必須將所有這些表合併到一個表中而不能重複。所有表格的部分處理都是相同的,但有一些細微之處。一個問題是列名略有不同(例如 X_Y 而不是 X)。每個表都有特定的列,但我不想檢索其中的數據。

我希望這不是一個太寬泛的問題,但是:

  • 嘗試做一個通用部分是否更好,將表名作為變數來應用相同的處理條件來處理差異?
  • 還是應該只複製和粘貼核心/模板數據流並在單獨的包中管理每個差異?

鑑於:

  • 您不想為每個表提取一些列
  • 每個表的列名不同
  • 您只有 40 張桌子
  • 這是一次性遷移(可以安全地假設,對嗎?)

然後,我只需複制並粘貼核心數據流,並根據需要對每個表進行更改。對於少量表(不是 200 個或更多)的非重複過程,您不希望花費太多時間來創建永遠不會重複的可重複過程;-)。無論如何,您將不得不管理這些差異,因此您不妨將精力放在那部分上。

並且應該可以在 SSIS 中定義一個可重用的組件(腳本任務)來處理一些“常見”操作。如果沒有,只需創建一個接受表名並在那里處理常見步驟的儲存過程。然後,在 SSIS 中,只需為每個表呼叫該儲存過程,這樣您就可以對通用內容進行單一定義,如果您需要對通用更改進行輕微更改,那麼您只需要將它們放入一個地方:)。

(請參閱下面的更新部分)當您遇到無法將所有欄位拉過來並可能重命名欄位的問題時,另一個處理數據遷移的選項是使用SqlBulkCopy.NET 中的類,因為它可以很好地處理這些事情。您可以在 SSIS 中創建一個 C# 任務來使用此類,也可以使用 SQLCLR 儲存過程,例如DB_BulkCopy,它是SQL# SQLCLR 庫的一部分(我是該庫的作者,但此儲存過程位於免費版本)。我在以下答案中更詳細地描述了這一點:

將數據從一個數據庫導入另一個腳本

更新

在我發布上述建議後的第二天,添加了以下要求:

我必須將所有這些表合併到一個表中而不能重複。

鑑於這一新要求,我認為使用SqlBulkCopy替代選項不如我首先描述的方式堅持使用 SSIS 有吸引力。使用SqlBulkCopy/ DB_BulkCopy對數據進行重複數據刪除的唯一方法是從目標 / 目標伺服器執行程序,將數據載入到臨時表中(它必須是全域臨時表 - 意思是,從 開始##)源伺服器使用SqlBulkCopyDB_BulkCopy,然後從全域臨時表插入到真正的目標表中,同時根據您必須確定什麼是重複項的任何規則過濾掉“重複項”。

引用自:https://dba.stackexchange.com/questions/116835