【问题标题】:Detect which dataset row violates the DB unique constraint during insertion在插入过程中检测哪个数据集行违反了 DB 唯一约束
【发布时间】:2010-01-13 08:01:10
【问题描述】:

我正在从 SQL Server 管理 Studio 中的其他表向表中插入行,并且某些记录违反了唯一约束,因为初始数据“脏”且不一致。

我怎样才能找到违反了哪些记录?

【问题讨论】:

  • 顺便说一句,Oracle 有两种方法可以提供帮助。您可以让它在错误表中插入失败的行进行处理,或者您可以使用 MERGE 仅插入不匹配的行。

标签: sql sql-server constraints ssms


【解决方案1】:

不幸的是,您唯一的解决方案是通过针对源数据的查询来验证约束以找出罪魁祸首。如果您使用 SSIS 之类的东西,您可以将其配置为跳过违反约束的行。

【讨论】:

  • 伤心,真的。 rdbms 知道哪个失败了。它只是没有告诉你。
【解决方案2】:

找出关键是什么,然后尝试以下方法:

1) 数据已经存在:

从源表中选择源键字段 where exists (select * from desttable where destkeyfield=sourcekeyfield)

2) 来源重复:

select sourcekeyfield, count() from sourcetable group by sourcekeyfield with count()>1

【讨论】:

    【解决方案3】:

    查看此链接:

    DataSet hell - "Failed to enable constraints. One or more rows contain values...."

    Sanjay Sheth 声明:

    解决方法在于DataTable类的GetErrors方法: http://msdn.microsoft.com/library/en-us/cpref/html/frlrfSystemDataDataTableClassGetErrorsTopic.asp

    基本上,当我看到上面的消息时,我会检查 HasErrors 数据集中每个 DataTable 的属性,然后调用 报告错误的表上的 GetErrors 方法。 GetErrors 返回 DataRows 的集合,您可以调用 .RowError 属性 每个受错误影响的行,以找出究竟是什么 问题是。

    并补充:

    ...在填充之前关闭 .EnableConstraints。我通常启用 再次约束,仅在原始填充完成后。然后, 您可以捕获上面的异常并启动错误检测 完成我上面描述的功能。

    【讨论】:

      猜你喜欢
      • 2010-12-03
      • 1970-01-01
      • 2023-02-08
      • 2021-06-28
      • 1970-01-01
      • 2012-03-30
      • 2012-05-03
      • 2020-04-01
      • 2016-04-08
      相关资源
      最近更新 更多