51

我正在尝试将 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() 时,组件返回了失败代码。失败代码的含义由组件定义,但错误是致命的并且管道停止执行。

4

8 回答 8

76

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

解决方案:

  1. 查看此错误/警告的列名称。
  2. 转到 SSMS 并找到该表
  3. 允许该列为 Null
  4. 保存表格
  5. 重新运行 SSIS

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

看到这个链接

于 2013-11-05T10:27:57.653 回答
34

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

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

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

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

于 2016-01-29T09:15:55.843 回答
11

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

在此处输入图像描述

在此处输入图像描述

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

于 2013-10-02T21:54:55.683 回答
2

我发现这可能由于多种原因而发生。

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

于 2017-12-19T09:45:20.213 回答
1

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

于 2016-08-17T13:06:04.247 回答
0

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

有几个步骤可以尝试:

  1. 在目标服务器上对齐 db 用户和登录名:alter user [DBUSER_of_linkedserverlogin] with login = [linkedserverlogin]

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

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

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

于 2020-09-25T18:37:41.933 回答
0

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

于 2019-05-02T19:41:07.403 回答