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

Posted

技术标签:

【中文标题】该值违反了列的完整性约束【英文标题】:The value violated the integrity constraints for the column 【发布时间】:2013-10-09 08:53:14 【问题描述】:

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

[OLE DB 目标 [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 目标”(42) 上的 ProcessInput 方法失败,错误代码为 0xC0209029。已识别的组件从 ProcessInput 方法返回错误。该错误是特定于组件的,但该错误是致命的,会导致数据流任务停止运行。

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

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

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

【问题讨论】:

你能告诉我们你的代码吗? 【参考方案1】:

通常在未选中 Allow Nulls 选项时发生。

解决方案:

    查看该错误/警告的列名。 转到 SSMS 并找到表 允许该列为 Null 保存表格 重新运行 SSIS

试试这些步骤。它对我有用。

See this link

【讨论】:

【参考方案2】:

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

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

解决方案:选择工作表上的所有空行,包括最后一行数据之后的空行,然后点击删除行。

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

【讨论】:

这对我有用,我以为我快疯了。谢谢! 果然这正是帮助我将 Excel 2007 兼容工作表导入 SQL Server 2014 数据库表的原因;电子表格中我的数据下有些行似乎是空的,但它们是格式化的行。删除就可以了。谢谢!【参考方案3】:

作为@FazianMubasher 答案的一个小替代方案,您还可以添加一个 Conditional Split 任务以分支NULL 值到错误文件,或者只是忽略它们:

【讨论】:

我赞同你的意见 :-)【参考方案4】:

正如“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 值,上述查询就不再满足这一点。账单没有得到支付,收款收回您的建筑物,现在您失业了,这一切都是因为您没有进行影响分析等等。

【讨论】:

【参考方案5】:

我发现发生这种情况的原因有很多。

在我的情况下,当我滚动到 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】:

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

【讨论】:

【参考方案7】:

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

【讨论】:

【参考方案8】:

如果您没有为链接服务器使用有效的登录名,则可能是这一点。问题出在目标服​​务器端。

有几个步骤可以尝试:

    在目标服务器上对齐 db 用户和登录: 使用 login = [linkedserverlogin] 更改用户 [DBUSER_of_linkedserverlogin]

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

    备份表并重新创建它。

第二次解决了我的“值违反了列的完整性约束”的问题。

【讨论】:

以上是关于该值违反了列的完整性约束的主要内容,如果未能解决你的问题,请参考以下文章

ORA-02292: 违反完整约束条件 处理

MS ACCESS 完整性约束违反:NOT NULL 检查约束;

Laravel 删除(违反完整性约束)

oracle - 违反完整性约束 - 找到子记录

Laravel 迁移 - 违反完整性约束:1452 无法添加或更新子行:外键约束失败

SQLSTATE [23000]:违反完整性约束:4025 CONSTRAINT