2011-01-25 105 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不高兴。