Sql-Server
SSIS:如何檢查記錄是否存在於平面文件中但存在於數據庫中
我正在準備一個 SSIS 作業,我將 .CVSV 文件導入到 OLE DB 目標(sql 數據庫)。我們將每天獲取這些文件。.CSV 文件包含醫生的記錄。每行代表一個醫生。下圖顯示了我如何能夠成功地做到這一點。到目前為止沒有問題。
以下是我需要幫助的內容:
如果醫生不再活躍,我們將獲得相同的 .CSV 文件,但沒有他/她的記錄。如何檢查記錄是否不在 .CSV 文件中但它存在於 SQL 數據庫中?我需要更新 SQL 數據庫中的醫生行並將該行的 IsActive 欄位更新為 false。
如何檢查記錄是否不在 .CSV 文件中但它存在於 SQL 數據庫中?
有一個暫存表 (例如
dbo.tmp_DOCTORS
,或您遵循的任何命名約定),它將首先截斷*(每次載入 CSV,請確保截斷暫存表)*,然後導入整個 CSV。然後,您可以通過檢查特定記錄是否在臨時表中來更新主表。通過這種方式,您可以更好地控制流程,只更新主表或向主表添加新記錄。您可以使用 TSQL (Merge) 或SSIS來完成。
這就是我們所做的,它在主表上產生的成本更少,因為您將只更新或添加已更改的記錄。
此外,我真的很喜歡軟刪除
IsActive
= TRUE 或 FALSE的想法。這樣您也可以保留歷史記錄。
不確定這是否是一個正確的答案,但目前我的代表太低,無法發表評論。我有類似的任務,我通過儲存過程將載入表與目標表進行比較(在你的 ssis 包中執行 sql 步驟)。就像是:
With Inactive as ( -- returns doctor id's that appear in the Load table but NOT in the target table select doctorId from LoadTable except select doctorId from TargetTable ) Update TargetTable set active = 'no' from TargetTable tt inner join Inactive cte on cte.doctorId = tt.doctorId ;
希望這可以幫助。