0

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

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

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

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

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

4

2 回答 2

2

有几个选项:

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

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

现在,您可以利用 DBCC CHECKCONSTRAINTS 来查看所有违反约束的情况。阅读更多关于此的内容。

USE DBName;
DBCC CHECKCONSTRAINTS(MainCheckTable) WITH ALL_CONSTRAINTS;
于 2020-10-28T09:09:58.540 回答
0

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

如果有意义的话,您需要从约束最小的表向后工作到约束最大的表。

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

于 2020-10-28T08:52:57.000 回答