我有一个使用动态SQL创建许多INSERT INTO
语句的存储过程。我无法控制我尝试插入的数据,并且插入的值是从
SELECT * FROM sourceTable
有时,插入时会触发外键约束(数据从环境A中获取并插入到环境B中,因此某些其他表可能未保持更新)
我的问题是 - 有没有办法在执行任何错误(外键约束或其他)之前预处理所有INSERT
语句?或者我是否需要创建检查点并使用回滚功能?
---流程概述
我们根据选择标准
在包含数据子集的环境A(源)上创建表使用SQL导出向导,这些表将复制到环境B(目标)
运行存储过程以将这些表中的数据导入到相应的表中 环境B上的表。此sp在包含所有表名
的动态SQL循环中使用INSERT INTO tableA SELECT
* FROM tableAFromSource
命令
由于我们无法控制的外部因素(服务器无法链接,数据结构,服务器权限等),因此使用此方法
答案 0 :(得分:-1)
我不知道任何类型的预处理会检查任何给定查询的结果,但使用普通T-SQL检查条件通常很容易。如果您只是想避免违反主键约束,可以使用您提供的查询的以下变体(考虑Id
主键):
INSERT INTO tableA
SELECT *
FROM tableAFromSource src
WHERE src.Id NOT IN ( SELECT tba.Id FROM tableA tba );