2012-05-07 17 views
4

我試圖編寫一個應用程序,將從SQL Server數據庫中取出信息,通過webservice加載對象模型,然後通過將該信息導入Access數據庫,該數據庫基於與SQL Server數據庫不同的模式,但所包含的信息相同(因此我認爲這與ETL過程類似)。我遇到的問題是數據庫中的主鍵(SQL Server)是GUID,而我將它們放入(Access)的數據庫是INT。因此,例如:維護數據庫與Guids和另一個與整數鍵之間的數據庫關係

表1,個人表中的SQL Server:

╔══════════════════════════════════════╦══════════╦════════════╗ 
║     ID     ║ Name ║ CreatedOn ║ 
╠══════════════════════════════════════╬══════════╬════════════╣ 
║ 3648F6BB-F743-4952-9C69-93336667F3B1 ║ Person 1 ║ 01/01/2012 ║ 
║ DE44577A-CAE7-4101-B962-C052214E723B ║ Person 2 ║ 02/01/2012 ║ 
║ 94115C5E-9C7E-40CF-8A87-D4D837BD5DB3 ║ Person 3 ║ 03/01/2012 ║ 
║ F93E77D9-C344-420C-9499-BA3B4DD0F0BA ║ Person 4 ║ 04/01/2012 ║ 
╚══════════════════════════════════════╩══════════╩════════════╝ 

表2,個人表在Access:

╔════╦══════════╦════════════╗ 
║ ID ║ Name ║ CreatedOn ║ 
╠════╬══════════╬════════════╣ 
║ 1 ║ Person 1 ║ 01/01/2012 ║ 
║ 2 ║ Person 2 ║ 02/01/2012 ║ 
║ 3 ║ Person 3 ║ 03/01/2012 ║ 
║ 4 ║ Person 4 ║ 04/01/2012 ║ 
╚════╩══════════╩════════════╝ 

所以表1中的數據是如何在返回SQL Server數據庫和表2是如何在Access數據庫中顯示信息。所以所有的GUID都應該是整數,但數據之間的關係應該保持不變。因此,例如,如果我在SQL Server和Access中運行查詢來獲取人員的地址(地址表也將設置爲類似地址),則無論是否使用GUID或整數,查詢都應返回相同的結果。

我是用在SQL Server ROW_NUMBER(),由CreatedOn日期排序思維(這是在數據庫中。作爲這樣的日期時間類型,應該是所有記錄是唯一的):

SELECT 
    (ROW_NUMBER() OVER (ORDER BY CreatedOn)) AS ID, 
    Name, 
    CreatedOn 
FROM Table2; 

唯一的是我看到從查詢中返回重複的整數ID。因此,例如上面的表1看起來是這樣的:

╔════╦══════════╦════════════╗ 
║ ID ║ Name ║ CreatedOn ║ 
╠════╬══════════╬════════════╣ 
║ 1 ║ Person 1 ║ 01/01/2012 ║ 
║ 2 ║ Person 2 ║ 02/01/2012 ║ 
║ 1 ║ Person 3 ║ 03/01/2012 ║ 
║ 1 ║ Person 4 ║ 04/01/2012 ║ 
╚════╩══════════╩════════════╝ 

當每個ID應該是唯一的。任何人都可以想出一個很好的方法去做我想要完成的事情嗎?我目前正在嘗試這樣做的方式有什麼問題嗎?

任何幫助將不勝感激。

回答

0

最簡單的解決方案是在一端或另一端更改模式,使它們相同。如果您要在Access和SQL兩端添加記錄,那麼我會使用GUID來防止爲兩個不同的記錄添加相同的ID。那麼你所做的就是推出自己的「複製」系統。 Access和SQL都支持GUID。

如果你不想要每個表的某種查詢。這會給你每個GUID的Integer等價物,反之亦然。如果您將GUID添加爲Access表(表2)中的附加列,則可以將其用作查找表。

ROW_NUMBER()將返回唯一的數字,但每次使用時都會從1開始,因此每個表的所有插入都需要在一組中完成。如果您在訪問時使用自動編號字段,則會爲您提供跨單獨插入的唯一值。

鑑於您現在在Access表中擁有SQL的GUID和唯一ID,只要使用外鍵(例如地址表)插入到表中,就需要執行查找。因此,當您使用GUID插入SQL中的地址時,請在GUID上標識Join人的Person表,然後插入Person的整數ID。

1

我不會依賴ROW_NUMBER()如果我是你,因爲你可能無法確保秩序始終是相同的:

首先,在你的榜樣,你只顯示最新值(無時間)爲CreatedOn列。如果在同一天創建了多個人,那麼如果您在該日期前訂購,則無法確定哪個人最先到達。
即使您實際上也有時間在CreatedOn列中 - 如果從表格中刪除某個人,所有後續人員的ROW_NUMBER將會更改。


最簡單的解決辦法是改變一個表,像已經webturner在his answer建議。
如果因爲任何原因(例如,如果您不允許更改任一數據庫的模式,或者如果您更改表的模式時遺留的東西會中斷),您無法執行此操作,則可以創建您存儲兩個表之間的關係的映射表:

╔══════════════════════════════════════╦══════════╗ 
║    SqlServerID    ║ AccessID ║ 
╠══════════════════════════════════════╬══════════╣ 
║ 3648F6BB-F743-4952-9C69-93336667F3B1 ║ 1  ║ 
║ DE44577A-CAE7-4101-B962-C052214E723B ║ 2  ║ 
║ 94115C5E-9C7E-40CF-8A87-D4D837BD5DB3 ║ 3  ║ 
║ F93E77D9-C344-420C-9499-BA3B4DD0F0BA ║ 4  ║ 
╚══════════════════════════════════════╩══════════╝ 

你甚至可以把它放到第三個數據庫,如果你不能改變現有的。