2011-01-25 143 views
1

我正試圖執行一個存儲過程,該過程在將數據從一個表插入到另一個表時失敗。 錯誤是執行存儲過程時出錯

不能在對象'ExtpndPart1具有唯一索引插入重複鍵行「IDX_Primary」

我知道,當目標表具有特定的欄主鍵此錯誤來得快,源表在該列中有重複。 但我高速存儲過程中的主鍵的條件。

IF EXISTS (SELECT * FROM dbo.sysindexes WHERE name = N'PK_ExtpndPart1') 
ALTER TABLE [dbo].[ExtpndPart1] DROP [PK_ExtpndPart1] 

任何人都可以幫助我?

+0

你想插入重複嗎?或者在嘗試插入之前是否希望刪除重複項? – Randy 2011-01-25 20:29:17

+0

插入重複也 – 2011-01-25 20:31:18

+0

如果插入重複項,爲什麼有獨特的索引? – 2011-01-25 20:34:13

回答

0

它看起來像你試圖刪除索引PK_ExtpndPart1,但違規指數是IDX_Primary

1

好像你正在尋找/丟失錯誤的索引。您正在丟棄PK_ExtpndPart1,但錯誤指的是IDX_Primary

0

無論你或你的服務器顯然是錯誤的。如果你是對的,並且不會插入重複的內容,這將違反IDX_Primary,那麼這顯然是你的服務器的錯。

否則,你可能只是忽略了這樣一個事實,那就是重複的東西真的存在。它們都在源表中,或者目標表未被正確截斷。

沒關係,你不願意分享機密代碼,但是除了你所透露的信息之外,我們沒有什麼信息。

無論如何,我正在備份你已經被告知的內容:冒犯指數是IDX_Primary,而不是PK_ExtpndPart1。所以你會怎麼做?首先,找到創建IDX_Primary的腳本並注意索引表達式/表達式。完成該操作後,只需在源表的簡單查詢中使用表達式,以確定是否確實沒有重複項。

我想你可以很容易想出一些這樣的腳本,但僅僅因爲我沒有看到我可以幫助你解決缺乏細節的問題,所以我決定與你分享這個小模板:

SELECT 
    ..., /* column(s) or expression(s) as used in IDX_Primary 
     (actually, their counterparts in the source table) */ 
    COUNT(*) 
FROM ... /* your source table */ 
GROUP BY ... /* the same IDX_Primary column(s) or expression(s) */ 
HAVING COUNT(*) > 1 

正如你所看到的,結果會是非常重複,肯定會使IDX_Primary不高興。