2016-06-08 140 views
0

我在不同的服務器上有兩個數據庫,它們的表名爲dbo.A。數據兩者在很大程度上是相同的,但我想確保兩個表具有相同的數據。我一直在使用SQL Server 2016年6月將數據從一個表導出到另一個表,但是我得到的錯誤是:將數據插入到可能有重複數據的SQL Server數據庫中

違反PRIMARY KEY約束''。不能在對象中插入重複鍵一個

重複的鍵值爲「在這裏寫一些文字」

我知道我可以刪除該表並重新插入行,但這是繁瑣和非常糟糕的做法。什麼是我更新第二個數據庫中數據的最佳方式?

回答

1

將服務器添加爲您的鏈接服務器並使用以下語句。

要在表A的發言權添加行即成B的表A.

INSERT INTO dbo.A (Col1 , Col2 , Col3 , ....) 
SELECT Col1 , Col2 , Col3 , .... 
FROM [LinkedServerB].[DBName].[dbo].[A] A 
WHERE NOT EXISTS (SELECT 1 FROM dbo.A 
        WHERE A.PK_Column = PK_Column) 

然後用服務器B上相同的查詢到從服務器A中添加的行

爲了從TableA中添加行的發言權服務B的表A.

INSERT INTO dbo.A (Col1 , Col2 , Col3 , ....) 
SELECT Col1 , Col2 , Col3 , .... 
FROM [LinkedServerA].[DBName].[dbo].[A] A 
WHERE NOT EXISTS (SELECT 1 FROM dbo.A 
        WHERE A.PK_Column = PK_Column) 
+0

由於我沒有頂級權限,所以沒有給予我權限。有沒有辦法做到這一點,而無需鏈接服務器? – megadarkfriend

+1

在具有相同結構的兩臺服務器中創建'dbo.A'的副本,減去PK列的PRIMARY KEY約束,例如在名爲'dbo.A_Stage'的表中。現在執行與兩臺服務器相同的輸出,但指向登臺表'dbo.A_Stage'。然後,修改Ali的查詢'FROM [LinkedServerA]。[DBName]。[dbo]。[A] A'到'FROM [dbo]。[A_Stage] A'〜這樣數據首先被導出到彼此的一邊,插入是在本地完成的。在每個服務器腳本的末尾添加'TRUNCATE TABLE dbo.A_Stage',或者如果您沒有權限,則應清除'DELETE FROM dbo.A_Stage'。 – RDJ

1

好吧,如果你不能使用鏈接的服務器,你可以將數據複製到一個空的臨時表。然後運行類似的插入語句,但使用臨時表而不是鏈接表

相關問題