该值违反了列的完整性约束

时间:2013-10-02 20:11:30

标签: ssis

我正在尝试将数据从Excel文件导入SQL Server数据库。我无法这样做因为我在日志文件中遇到以下错误。请帮忙。日志错误如下: -

  

[OLE DB Destination [42]]错误:发生了OLE DB错误。错误代码:0x80040E21。 OLE DB记录可用。来源:“Microsoft SQL Native Client”Hresult:0x80040E21说明:“多步OLE DB操作生成错误。检查每个OLE DB状态值,如果可用。没有工作。”。

     

[OLE DB目标[42]]错误:输入“OLE DB目标输入”(55)的输入列“F2的复制”(5164)出错。返回的列状态为:“该值违反了列的完整性约束。”。

     

[OLE DB目标[42]]错误: “输入 ”OLE DB目的地输入“(55)” 失败,因为错误代码0xC020907D发生,并在“输入 “OLE DB目的地输入” 错误行处置(55) “指定错误失败。指定组件的指定对象发生错误。

     

[DTS.Pipeline]错误:组件“OLE DB Destination”(42)上的ProcessInput方法失败,错误代码为0xC0209029。标识的组件从ProcessInput方法返回错误。该错误特定于组件,但错误是致命的,将导致数据流任务停止运行。

     

[DTS.Pipeline]错误:线程“WorkThread0”已退出,错误代码为0xC0209029。

     

[Excel Source [174]]错误:尝试向数据流任务缓冲区添加行失败,错误代码为0xC0047020。

     

[DTS.Pipeline]错误:组件“Excel Source”(174)上的PrimeOutput方法返回错误代码0xC02020C4。当管道引擎调用PrimeOutput()时,组件返回失败代码。失败代码的含义由组件定义,但错误是致命的,管道停止执行。

8 个答案:

答案 0 :(得分:55)

通常在未选中允许空值选项时发生。

解决方案:

  1. 查看此错误/警告的列名称。
  2. 转到SSMS并找到表格
  3. 允许该列为空
  4. 保存表格
  5. 重新运行SSIS
  6. 尝试以下步骤。它对我有用。

    See this link

答案 1 :(得分:26)

在最后一行数据后从Excel中删除空行

有时Excel中的空行仍被视为数据,因此尝试在包含一个或多个不可为空的列的表中导入它们会违反列的约束。

解决方案:选择工作表上的所有空行,即使是最后一行数据之后的空行,也请点击删除行。

显然,如果您的某些数据确实违反了表的任何约束,那么只需修复您的数据以符合数据库的规则。

答案 2 :(得分:9)

作为@ FazianMubasher答案的一个简单替代方案,您可以添加条件性拆分任务,而不是允许NULL指定列(可能由于多种原因而无法实现)将NULL值分支到错误文件,或者只是忽略它们:

enter image description here

enter image description here

答案 3 :(得分:7)

对于“F2的副本”列,错误消息显示“值违反了列的完整性约束”

使它不会违反目标表中的值。您的问题中没有提供允许值,数据类型等,因此我们无法更具体地回答。

为了解决这个问题,不,实际上就像它说的那样:你正在将一些东西放入一个不允许的列中。它可以可以成为Faizan指出的,你将一个NULL放入一个NOT NULLable列,但它可能是一大堆其他的东西,而且原来的海报永远不会提供任何更新,我们只能猜测。是否存在插入违反的外键约束?也许有一个检查约束被吹?也许Excel中的源列具有Excel的有效日期值,该值对目标列的日期/时间数据类型无效。

因此,关注具体信息,最好的答案是“不做破坏它的事情”在这种情况下,关于“F2的副本”的东西对目标列是不好的。给我们表定义,提供的值等,然后你可以得到具体的答案。

告诉人们将NOT NULLable列变成NULLable可能是正确的答案。它也可能是人类已知的最恐怖的答案。如果现有进程期望在“F2的副本”列中始终存在值,则将约束更改为NULL会对现有查询造成严重破坏。例如

SELECT * FROM ArbitraryTable AS T WHERE T.[Copy of F2] = '';

目前,该查询检索刚刚导入的所有内容,因为Copy of F2是一个命名不佳的状态指示符。这些数据需要被输入下一个系统,因此...账单可以获得报酬。只要使得未处理的行可以具有NULL值,上述查询就不再满足该值。条例草案没有收到报酬,收藏品归还你的建筑物,现在你已经失业,这都是因为你没有进行影响分析等等。

答案 4 :(得分:1)

Teradata表或视图将NULL存储为"?"并且SQL将其视为字符或字符串。这是错误的主要原因"当数据从Teradata源移植到SQL目标时,该值违反了列的完整性约束。" 。 解决方案1:允许目标表保持NULL 解决方案2:转换'?'字符存储为目标表中的某个值。

答案 5 :(得分:1)

我发现由于种种原因会发生这种情况。

在我的情况下,当我滚动到SQL导入“报告”的末尾时,在“后执行(成功)”标题下,它将告诉我复制了多少行,它通常是工作表中的下一行问题。您还可以通过导入消息告诉哪一列(在您的情况下是“F2的副本”),这样您通常可以找出哪个是Excel中的违规单元格。

我发现这种情况非常愚蠢,例如Excel中的日期格式与以前的行不同。例如,单元格A2是“05/02/2017”,而A3是“5/2/2017”或甚至是“05-02-2017”。似乎导入要求事情完全一致。

如果Excel格式不同,即使B2为“512”但Excel“数字”格式且B3为“512”但Excel“文本”格式,则单元格将导致错误。

我还遇到过这样的情况:我必须删除Excel工作表中数据行下面的所有“空”行。有时它们看起来是空的,但Excel认为它们具有“空白”数据或类似的东西,因此导入也尝试导入它们。如果您的Excel表格中有先前已清除但尚未正确删除行的数据,则通常会发生这种情况。

然后有明显的理由试图将文本值导入整数列或将NULL插入NOT NULL列,如其他人所述。

答案 6 :(得分:0)

您可以替换原始文件和字段/列中的“空”值。

答案 7 :(得分:0)

要点是,如果您没有对链接服务器使用有效的登录名。问题出在目标服​​务器端。

可以尝试以下几个步骤:

  1. 对齐数据库用户并在目标服务器上登录: 用login = [linkedserverlogin]更改用户[DBUSER_of_linkedserverlogin]

  2. 在链接服务器使用的目标服务器上重新创建登录名。

  3. 备份表并重新创建它。

2nd通过“值违反了列的完整性约束”解决了我的问题。