從 SSIS 中的 SP 更新表
我知道有與此類似的問題,但我找不到回答我的問題的問題。
在我目前的 SSIS 包中……我有一個數據流任務……從 db 上的儲存過程(包含大約 10k 行)中獲取輸出 將輸出插入到 dbo 中的表中
問題是我有兩種選擇這樣做(否則我會打破主鍵限制)
1.) 在向表中插入數據之前截斷表
這是有問題的,因為如果 SP 由於某種原因失敗了怎麼辦?其他過程使用此表並依賴它來獲取數據。
2.)使用“更新”命令一次更新 1 行約 10k 行
這佔用了我們伺服器上的資源,它已經在做一些繁重的工作,只是為了執行儲存過程(是的,它是一個寫得很糟糕的 SP,但我離題了)。我研究了行計數,然後在截斷之前檢查計數變數,但我無法弄清楚如何在數據流中使用源自儲存過程的數據來使其工作。
所以必須有一種我不知道的方法來輕鬆獲取我的數據並且只更新現有記錄或插入新記錄。
PS SQL 伺服器 2014
OLE DB 源 = EXEC somesp.sp
|
Count = Count rows(稍後使用,與手頭的任務無關)
|
Sort = 對數據完整性進行排序,以確保不會破壞我的主鍵(來自 sp 的數據)
|
目標 = 將 sp 結果中的記錄放入目標表中
您描述的是一個經典的 UPSERT 模式,以更新一些記錄和插入其他記錄的雙重目的命名。
T-SQL 提供了MERGE語句,可以使用並且性能很好。並不總是最容易編寫/維護。
SSIS 選項:
通過 SSIS 進行 UPSERT - 本質上,您所做的是辨識更新行並將它們儲存在臨時表中,以便您可以通過 SSIS 控制流中的執行 SQL 任務而不是數據流中的逐行 OLEDB 命令來處理更新. 基本需求是辨識您的更新行並將它們發送到 TMP 表目標。在數據流之後添加一個執行 SQL 任務並作為一個集合進行更新。您將看到 OLEDB 命令任務的性能大幅提升,這可能就是您所需要的。正常處理目標表中的插入。 如果存在源查詢與現有表連接,則確定是否需要更新,否則插入。您可以盲目更新,或者在我的情況下,如果它們存在,我可以快速加入,然後再檢查是否真的有更新……您可以根據您的數據/加入條件一步完成所有這些。
通過 SSIS 刪除/插入 - 與 #1 非常相似,但不是執行更新,而是使用兩個 SQL 任務首先刪除更新行,然後插入它們的新版本。所有非更新行都作為數據流中的正常插入寫入。