我正在使用ssis,我收到此错误“违反PRIMARY KEY约束。无法在对象中插入重复键。重复键值为

时间:2016-09-30 22:06:00

标签: sql-server ssis

我是SSIS的新手,我收到一条错误消息。谁能帮我 ?我的数据中没有重复

错误消息是 OLE DB记录可用。来源:“Microsoft SQL Server Native Client 11.0”Hresult:0x80040E2F描述:“违反PRIMARY KEY约束'PK_DimCourse'。无法在对象'dbo.DimCourse'中插入重复键。重复键值为(CS1301)。”。

我当前的表格如下

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[DimCourse](
    [CourseCode] [nvarchar](10) NOT NULL,
    [SubjectCode] [nvarchar](10) NOT NULL,
    [CourseNumber] [nvarchar](10) NOT NULL,
    [CourseTitle] [nvarchar](50) NOT NULL,
    [Level1] [nvarchar](20) NOT NULL,
    [Level2] [nvarchar](20) NOT NULL,
 CONSTRAINT [PK_DimCourse] PRIMARY KEY CLUSTERED 
(
    [CourseCode] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

2 个答案:

答案 0 :(得分:3)

我知道我来不及回答。我收到类似的错误信息,发现问题是什么,并解决了它。我希望它能帮助未来的读者。

<强>情境:

  1. 我有一个带有主键的dbo.Codes的源表 组合(CodeID,CodeName)。
  2. 为了创建我的目的地 表,我使用过SQL Server - &gt;数据库 - &gt;任务 - &gt;生成 脚本,选项。
  3. 然后,在SSIS包中,我只使用了OLE DB 源和OLE DB目标元素。它回来了 错误:“违反PRIMARY KEY约束'pkCodes'。无法插入 对象'dbo.Codes'中的重复键。重复的键值是 (106,da7A)。“。
  4. 我试图解决的问题:

    1. 我尝试使用sql命令作为源:Select CodeID, CodeName from dbo.Codes GROUP BY CodeID, CodeName。它仍然返回错误。我此时感到困惑。
    2. 在线搜索后,我发现了添加SSIS工具箱的提示 - &gt; Common - &gt; OLE DB源和OLE DB目标之间的排序元素。我在Sort元素中选中了“删除具有重复排序值的行”选项。我还是得错了。
    3. 然后,我在OLE DB Source和Sort元素之间启用了数据查看器。我可以看到有两行:106,da7a和106,源表中的da7A。
    4. 真正的问题是什么?

      我的源表coulmn CodeName区分大小写,但目标表中的CodeName列不区分大小写。这是因为,sql server生成脚本选项,默认情况下Script Collat​​ion设置为false。

      对我有用的解决方案:

      我使用脚本排序选项重新创建了我的目标表:True,这使我的目标列区分大小写并解决了我的问题。

答案 1 :(得分:0)

使用CourseCode =&#39; CS1301&#39;的记录已存在于目标中,SSIS将从源中插入相同的CourseCode,从而导致重复。

该目标或您的目标不包含CourseCode =&#39; CS1301&#39;但是,您的源数据包含两个具有相同CourseCode的行。通过将副本插入目标环境也会导致重复。

我建议您查询CourseCode =&#39; CS1301&#39;的源数据。看你是否找到两行。如果只有一行,请查询CourseCode =&#39; CS1301&#39;的目标数据。如果还有一行,则根据情况进行比较,您可能需要删除其中一行。