2017-05-29 52 views
0

我在C#中使用SqlBulkCopy類將數據從一個SQL Server數據庫快速複製到另一個數據庫。這些數據庫位於不同的服務器中,它們的數據表沒有任何PK,所以過程變得更加複雜。如何正確避免在沒有任何PK的SQL Server數據表中插入重複行?

的問題是,我使用的是從原始數據庫中選擇數據的查詢得到重複的行和SqlBulkCopy無法避免在目標數據庫中插入重複記錄。

我不能使用SELECT *,因爲它會拋出OutOfMemoryException,所以我做了SELECT TOP X *並將該數據加載到DataTable中。在每個Datatable中,我可以使用C#刪除重複的記錄,但是當我選擇下一個TOP X時,所選的第一行可能等於之前DataTable中已經插入目標數據庫的最後一行。 DataTable變量總是相同的,它被重新加載!

我想避免重複記錄被未插入創建PK,因爲它並不適用於我的情況。我真的需要使用SqlBulkCopy,因爲快速複製是系統要求。任何建議?先謝謝你!

+1

將數據加載到臨時表中,然後將數據從臨時表移動到最終表,刪除數據庫中的重複項。 –

+0

我在想這件事,也許這真的是這種情況的唯一選擇。我需要更多地研究這個問題。說明表與臨時表相同嗎?它們是否應該與最終表格在同一個數據庫中創建? – AnnaB

+0

可以;你只是做SELECT DISTINCT? – SomeStudent

回答

0

請勿使用C#。

您可以右鍵單擊您的源數據庫SSMS中,選擇「任務」,然後選擇「生成腳本」。選擇你想要的表格並使用嚮導來生成插入腳本。然後在第二個數據庫上運行這些。

如果需要重複此操作,可以在兩個SQL Server實例之間設置一個Linked Server,然後在Stored Procedure中寫入一個插入語句。然後,您可以隨時運行該存儲過程,或者call it from C#

如果你希望它運行規律,你可以建立一個Job on the database

+0

這不是一個可行的解決方案,因爲原始數據庫一直在增加。我需要使用OOP語言,因爲解決方案需要其他內容。任何其他建議Tom.Bowen?謝謝你的回答! – AnnaB

+0

爲什麼它必須是OOP語言?你只需要一次又一次自動完成的事情? –

+0

@mvc我已經添加了一些更多的選項來實現你所需要的。 –

0

你有沒有考慮複製行出來的第一個數據庫到磁盤上,而不是在存儲器中的文件?然後,您將能夠一次性完成所有這些工作,而不需要使用select top X *進行批次處理。一旦數據在磁盤上,就可以對它進行排序 - 甚至可以使用處理大文件的Unix sort的實現 - 並刪除重複的記錄。

如果你想刪除重複項,然後在某一時刻,您將需要在一個地方所有的數據,要麼對其進行排序或作出它的索引。這可以在第一個數據庫,內存中,磁盤上或第二個數據庫中。有一些原因可能導致您不想在任一數據庫中建立索引,並且沒有空間存儲內存中的所有數據,因此似乎將其假脫機磁盤作爲唯一選項。我個人認爲,做一個主鍵非常困難。雖然你說它不適用,但它可能是值得讓它只是爲了幫助數據加載。

相關問題