2012-04-10 87 views
3

我們收到來自客戶的數據饋送,每次都會得到大致相同的模式,儘管它可以在客戶端更改,因爲它們使用的是第三方應用程序。當我們收到數據文件時,我們將數據導入到一個臨時數據庫中,每個數據文件(學生,出勤等)都有一張表格。然後,我們希望將該數據與我們已經存在於該客戶的數據庫中的數據進行比較,並查看上一次運行中哪些數據發生了更改(列已更改或整行可能被刪除)。然後,我們希望將更新後的值或刪除的行寫入審計表,以便我們可以返回查看先前數據導入中更改的數據。我們不想更新數據本身,我們只想記錄兩個數據集之間的不同。然後,我們將刪除客戶數據庫中的所有數據,並按照來自新數據文件的數據完全導入數據,而無需更改(此指令已傳出並且無法更改)。最大的問題是我需要動態地做到這一點,因爲我不知道我將從客戶那裏得到什麼架構,因爲他們可以定製到他們的表。我需要能夠動態確定目標中有哪些表及其結構,然後查看源並比較這些值以查看數據中發生了什麼變化。如何在SQL Server中動態比較源表和目標表中的行

附加信息: 源代碼中沒有ID列,但有幾列可以用作代理鍵,這些列可以組成不同的行。

我希望能夠爲每個表通用做到這一點,而不必硬編碼值,雖然我可能必須爲單獨的參考表中的每個表的代理鍵做到這一點。

我可以使用SSIS,SPs,觸發器等,無論哪個更有意義。我已經看了所有的東西,包括tablediff,而且似乎沒有我需要的所有東西,或者一旦我進入它們,邏輯開始變得非常複雜。

當然,任何具有這樣的事情的任何具體的例子,他們已經做了將不勝感激。

讓我知道是否有任何其他信息會有所幫助。

感謝

+0

請包括表格/文件結構。 – Maess 2012-04-10 19:17:12

+0

@Maess - 你看過這個問題嗎?表格改變。 – JonH 2012-04-10 19:19:51

+0

你所有的客戶都向你發送文件。您獲得的這些文件具有一組通用列,但客戶端可以添加自己的自定義列。你關心這些自定義列中的數據嗎?因爲您正在討論爲每個文件動態更新永久表模式,假設您想保留自定義數據。 – lyrisey 2012-04-10 19:49:18

回答

1

如果要比較兩個表,以查看該關鍵字是什麼,是不同的「除了」


select col1,col2,... from table1 
except 
select col1,col2,... from table2 

這給你table1中的一切,是不是在表2。


select col1,col2,... from table2 
except 
select col1,col2,... from table1 

這給你表2中的一切,是不是在表1。


假設你在這兩個表上有一些有用的持久主鍵,這兩個集合中的所有東西都是一個變化。第一套中的所有內容都是插入內容;第二組中的所有內容都是刪除。

+0

這實際上是我用來縮小需要檢查的記錄的方法,以查看它們是否發生了變化。沒有PK,但有幾列我們定義爲數據集的「關鍵」。我們結束了列在一個單獨的表中。然後我使用except比較完整的行,以獲得兩個數據集中使用不同的行(使用INFORMATION_SCHEMA),然後比較兩者之間的「關鍵」列。如果鍵是相同的,那麼我就把它算作一個更改的行,並記錄每個列的舊/新值的更新。 – Rogman 2012-04-12 00:16:55

2

我工作過一個類似的問題,並使用一系列元數據表來動態比較數據集。這些元數據表描述了哪些數據集需要分階段進行,以及哪些列組合(及其數據類型)作爲每個表的業務關鍵點。

這樣你就可以動態地構造一個SQL查詢(例如,,帶有一個SSIS腳本組件),它執行完整的外部聯接以找出兩者之間的差異。

您可以將自己的元數據與SQL Server的元數據(使用sys。*或INFORMATION_SCHEMA。*)結合起來,以檢測列中是否仍存在列,並且數據類型與您的預期相同。

將不匹配的元數據重定向到用於評估的錯誤流。

這種工作方式是非常危險的,但如果您維護好元數據,就可以完成。

+1

我結束了使用information_schema獲取表的列的列表,然後建立像我下面的EXCEPT比較列列表。這給了我一個更小的數據集來處理和光標直到確定數據是否被更新或刪除。更好的工作與幾百萬人的行/千行,而不是我之前看到的幾百萬。 – Rogman 2012-04-12 00:20:48