从另一个 table 插入数据时获取所有约束错误

Get all constraint errors when inserting data from another table

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

的语句
INSERT INTO <someTable> SELECT <columns> FROM StagingTable;

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

我曾尝试使用 TRY...CATCH 机制,但是,这会在第一个错误和 运行 catch 子句中抛出错误,但不会继续处理其他数据。请注意,不应插入没有违规的正确数据,因此整个插入语句可以在出现一个错误时回滚,但是,我希望看到所有违规以便能够更正它们而不必 运行多次插入语句以获取所有错误。

编辑: 需要检查的约束类型有外键约束、NOT NULL约束、重复键。没有转换,所以不需要检查转换。

首先,不要看你的主要 table(s)。查看相关的 tables 例如查找等。首先填充这些。填充相关 table 后(即)满足所有相关约束,然后添加数据。

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

您应该检查您的相关 table 是否具有您打算插入的所需引用 values/fields。这很容易做到,因为您已经有了暂存 table.

有两个选项:

  1. 如果你想捕获行级信息,你必须使用游标或 while 循环并尝试在 TRY CATCH 块中插入每一行并查看是否出现任何错误,并记录一样。

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

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

USE DBName;
DBCC CHECKCONSTRAINTS(MainCheckTable) WITH ALL_CONSTRAINTS;