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

Sql 从另一个表插入数据时获取所有约束错误,sql,sql-server,azure-sql-database,staging-table,Sql,Sql Server,Azure Sql Database,Staging Table,我的Azure SQL数据库(Azure SQL数据库12.0.2000.8)中有一个没有任何约束的暂存表。我想将Staging表中的数据插入到设置了多个约束的“real”表中。在插入数据时,我使用了这样的语句 INSERT INTO <someTable> SELECT <columns> FROM StagingTable; 插入到SELECT FROM StagingTable中; 现在我只在违反某些约束时得到第一个错误。然而,对于我的用例,重要的是获得所有的违

我的Azure SQL数据库(Azure SQL数据库12.0.2000.8)中有一个没有任何约束的暂存表。我想将Staging表中的数据插入到设置了多个约束的“real”表中。在插入数据时,我使用了这样的语句

INSERT INTO <someTable> SELECT <columns> FROM StagingTable;
插入到SELECT FROM StagingTable中;
现在我只在违反某些约束时得到第一个错误。然而,对于我的用例,重要的是获得所有的违规行为,这样它们就可以一起得到解决

我已经尝试使用
TRY…CATCH
机制,但是,这将在第一个错误上抛出一个错误并运行CATCH子句,但是它不会继续处理其他数据。请注意,不应插入没有冲突的正确数据,因此可以在一个错误上回滚整个insert语句,但是,我希望看到所有冲突都能够更正,而不必多次运行insert语句来获取所有错误

编辑:
需要检查的约束类型包括外键约束、非空约束和重复键。没有进行转换,因此无需检查转换。

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

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


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

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

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


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

有两个选项:

  • 如果要捕获行级别的信息,必须使用游标或while循环,尝试在try-catch块中插入每一行,查看是否有错误,并记录相同的错误

  • 创建另一个类似于主表(比如MainCheckTable)的具有所有约束的表,禁用所有约束并加载数据

  • 现在,您可以利用DBCC CHECKCONSTRAINTS查看所有约束冲突

    使用DBName;
    DBCC CHECKCONSTRAINTS(MainCheckTable)和所有_约束;
    
    有两个选项:

  • 如果要捕获行级别的信息,必须使用游标或while循环,尝试在try-catch块中插入每一行,查看是否有错误,并记录相同的错误

  • 创建另一个类似于主表(比如MainCheckTable)的具有所有约束的表,禁用所有约束并加载数据

  • 现在,您可以利用DBCC CHECKCONSTRAINTS查看所有约束冲突

    使用DBName;
    DBCC CHECKCONSTRAINTS(MainCheckTable)和所有_约束;
    
    SQL Server的版本是什么?什么类型的约束?类型转换或外键冲突?它是Azure SQL数据库。我们无法选择该版本,因为它是PaaS组件。然而,微软保证它总是在最新版本上运行。我了解到,较低版本纯粹是出于兼容性原因,所以Microsoft SQL Azure 12.0.2000.8和Microsoft SQL Server 12.0.2000.8之间存在(显著)差异;前者将使用最新的功能,因为内部版本号不同(它是不同的产品)。SQL Server版本是什么?什么类型的约束?类型转换或外键冲突?它是Azure SQL数据库。我们无法选择该版本,因为它是PaaS组件。然而,微软保证它总是在最新版本上运行。我了解到,较低版本纯粹是出于兼容性原因,所以Microsoft SQL Azure 12.0.2000.8和Microsoft SQL Server 12.0.2000.8之间存在(显著)差异;前者将使用最新的功能,因为构建编号不同(它是不同的产品)。我们从外部承包商处获得数据。问题是,有时,这些数据是不正确的,我们需要返回到他们的所有违反数据。我们已经从约束最少的表开始工作,但是,外部承包商在引用另一个表时仍然可能出错。因此,我们仍然需要对此进行检查。进行查找需要了解表,但是,整个解决方案应该使用动态SQL自动工作,因此事先查找实际上是不可能的。我们从外部承包商处获取数据。问题是,有时,这些数据是不正确的,我们需要返回到他们的所有违反数据。我们已经从约束最少的表开始工作,但是,外部承包商在引用另一个表时仍然可能出错。因此,我们仍然需要对此进行检查。执行查找需要表的知识,但是,整个解决方案应该使用动态SQL自动工作,因此事先查找实际上是不可能的。