【问题标题】:Get all constraint errors when inserting data from another table从另一个表插入数据时获取所有约束错误
【发布时间】:2020-10-28 08:41:17
【问题描述】:

我的 Azure SQL 数据库(Azure SQL 数据库 12.0.2000.8)中有一个没有任何限制的临时表。我想将 Staging 表中的数据插入到设置了多个约束的“真实”表中。插入数据时,我使用了那种语句

INSERT INTO <someTable> SELECT <columns> FROM StagingTable;

现在我只在违反某些约束时收到第一个错误。但是,对于我的用例,获取所有违规行为很重要,因此可以完全解决它们。

我尝试过使用TRY...CATCH 机制,但是,这将在第一个错误时抛出错误并运行catch 子句,但它不会继续处理其他数据。请注意,不应该插入没有违规的正确数据,因此可以在一个错误时回滚整个插入语句,但是,我希望查看所有违规以便能够全部纠正它们而无需多次运行插入语句得到所有错误的次数。

编辑: 需要检查的约束类型是外键约束、NOT NULL 约束、重复键。没有进行转换,因此无需检查转换。

【问题讨论】:

  • SQL Server 版本是多少?有哪些类型的约束?类型转换或外键违规?
  • 它是一个 Azure SQL 数据库。我们不能选择版本,因为它是一个 PaaS 组件。但是,Microsoft 保证它始终在最新版本上运行。我读到较低版本纯粹是出于兼容性原因
  • 好的,Microsoft SQL Azure 12.0.2000.8 和 Microsoft SQL Server 12.0.2000.8 之间存在(显着)差异;前者将使用最新功能,因为内部版本号不同(它是不同的产品)。

标签: sql sql-server azure-sql-database staging-table


【解决方案1】:

有几个选项:

  1. 如果要捕获行级信息,则必须使用游标或 while 循环并尝试在 TRY CATCH 块中插入每一行,看看是否遇到任何错误,并记录相同的内容。

  2. 使用所有约束创建另一个类似于主表(例如 MainCheckTable)的表,并禁用所有约束并加载数据。

现在,您可以利用 DBCC CHECKCONSTRAINTS 查看所有违反约束的情况。Read more on this

USE DBName;
DBCC CHECKCONSTRAINTS(MainCheckTable) WITH ALL_CONSTRAINTS;

【讨论】:

    【解决方案2】:

    首先,不要查看您的主表。查看相关表格,例如查找等。首先填充这些。一旦您填充了相关表(即)满足所有相关约束,然后添加数据。

    如果有意义的话,您需要从约束最小的表倒退到约束最大的表。

    您应该检查您的相关表是否具有您打算插入的所需参考值/字段。这很容易做到,因为您已经有了一个临时表。

    【讨论】:

    • 我们从外部承包商那里获取数据。问题是,有时,这些数据是不正确的,我们需要在数据中的所有违规情况下返回给他们。我们已经从约束最小的表开始工作,但是,外部承包商在引用另一个表时仍然可能出错。因此,我们仍然需要检查这一点。进行查找需要了解表,但是,整个解决方案应该使用动态 SQL 自动工作,因此事先查找实际上是不可能的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-25
    • 1970-01-01
    • 2015-10-23
    • 1970-01-01
    相关资源
    最近更新 更多