2009-02-04 57 views
4

我將大量的行插入一個列上具有主鍵約束的空表中。 如果有重複鍵錯誤,是否有任何方法可以找出導致錯誤的鍵(或行)的值?在sql2008中違反主鍵約束的詳細錯誤消息?

在插入之前驗證數據可悲的是我現在不能做的事情。

使用SQL 2008.

謝謝!


在做COUNT(*)/以物組是什麼我試圖避免的,這是數億行的,從數百種不同的DB的(其中一些是在遠程服務器上)插入...我沒有時間或空間來插入兩次。

數據應該是唯一的提供者,但不幸的是他們的驗證似乎並沒有正常工作100%的時間,我試圖至少看到它的失敗,所以我可以幫助他們排除故障。

謝謝!

回答

0

修訂:
既然你不想插入兩次,可能你:

Drop the primary key constraint. 
Insert all data into the table 
Find any duplicates, and remove them 
Then re-add the primary key constraint 

前面的回覆: 將數據插入到表的副本沒有主鍵約束。

然後在其上運行查詢以確定具有rpimary鍵列的重複值的行。

select count(*), <Primary Key> 
from table 
group by <Primary Key> 
having count(*) > 1 
+0

奇怪的做法。現在你有一個填充了重複的表格,這意味着在稍後階段刪除。 – 2009-02-04 23:00:20

3

有沒有這樣做,不會減慢您的下跌過程中的一種方式,但這裏有一個方法,這將使它更容易。您可以在該表上添加替代觸發器以進行插入和更新。觸發器會在插入它之前檢查每條記錄,並確保它不會導致主鍵違例。您甚至可以創建第二個表來捕獲違規行爲,並在該行上具有不同的主鍵(如標識字段),並且觸發器會將行插入到您的錯誤捕獲表中。

這裏的觸發如何工作的一個例子:

CREATE TRIGGER mytrigger ON sometable 
INSTEAD OF INSERT 
AS BEGIN 
    INSERT INTO sometable SELECT * FROM inserted WHERE ISNUMERIC(somefield) = 1 FROM inserted; 
    INSERT INTO sometableRejects SELECT * FROM inserted WHERE ISNUMERIC(somefield) = 0 FROM inserted; 
END 

在這個例子中,我在檢查現場,以確保它的數字我將數據插入到表之前。您需要修改該代碼來檢查主鍵違例,例如,您可能將INSERTED表加入到您自己的現有表中,並且只在沒有找到匹配的地方插入行。

0

使用SSIS導入數據並讓它檢查這是數據流的一部分。這是處理的最佳方式。 SSIS可以將不良記錄發送到一個表格(您可以稍後發送給供應商以幫助他們清理其行爲)並處理好這些記錄。

1

解決方案將取決於發生這種情況的頻率。如果它的時間< 10%的話,我會做到以下幾點:

  1. 插入數據
  2. 如果錯誤,那麼就Bravax修訂後的溶液(刪除約束,插入,找到DUP,報告並殺死DUP,啓用約束)。

這意味着它只會在出現錯誤的幾次時花費您的代價。

如果這是更經常發生,那麼我想看看在送男生看到供應商的:-)

0

我不能相信,SSIS不容易解決這個「現實」,因爲,讓我們面對它,你經常需要並希望能夠:

  1. 看到,如果一個記錄有存在一定的唯一或主鍵
  2. 如果沒有,將其插入
  3. 如果確實如此,無論是忽略它或更新它。

我不明白他們如果沒有這種容易使用的內置功能就會讓產品出門。比如說,設置一個組件的屬性來自動檢查這個。

相關問題