执行存储过程时出错

时间:2011-01-25 20:26:18

标签: sql sql-server tsql

我正在尝试执行将数据从一个表插入另一个表时失败的存储过程。 错误是

  

无法在对象'ExtpndPart1'中插入具有唯一索引'IDX_Primary'的重复键行

我知道当目标表在特定列上有主键并且源表在该列中有重复项时会出现此错误。 但我有一个条件,它会删除存储过程中的主键。

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

任何人都可以帮助我吗?

3 个答案:

答案 0 :(得分:1)

好像你正在寻找/删除错误的索引。您正在删除PK_ExtpndPart1,但错误是指IDX_Primary

答案 1 :(得分:0)

您似乎试图删除索引PK_ExtpndPart1,但违规索引为IDX_Primary

答案 2 :(得分:0)

您或您的服务器显然是错误的。如果你是对的并且不会尝试插入会违反IDX_Primary的重复项,那么显然是服务器的错误。

否则你可能只是忽略了这样一个事实,即副本在某种程度上确实存在。它们位于源表中,或者目标表未被正确截断。

你不愿意分享机密代码是可以的,但是除了你所揭示的内容之外,我们几乎没有任何信息。

无论如何,我正在备份你已被告知的内容:被冒犯的索引是IDX_Primary,而不是PK_ExtpndPart1。所以你会怎么做?首先,找到创建IDX_Primary的脚本并注意索引表达式/表达式。完成后,只需在源表的简单查询中使用表达式,以确定是否确实没有重复项。

我认为你可以很容易地想出那种类型的脚本,但仅仅因为我没有看到我能在没有细节的情况下帮助你,我决定与你分享我的这个小模板:< / p>

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