2014-02-21 47 views
0

我有一个存储过程,它使用动态SQL创建许多INSERT INTO语句。我有过,我试图插入数据并无控制权,正在插入的值从INSERT INTO语句的预处理验证

SELECT * FROM sourceTable 

偶尔插入时,外键约束被触发导出(该数据是从环境中的拍摄和被插入环境B,所以有可能某些其他表没有保持最新)

我的问题是 - 是否有一种预处理方法验证所有我的INSERT语句的任何错误(外键约束或其他)执行它们之前?还是我需要创建检查点并使用回滚功能?

---过程概述包含基于选择标准

使用SQL导出向导数据的子集

我们创建环境A(源)表,这些表被跨越到复制环境B(目标)

运行存储过程以将这些表中的数据导入环境B上相应的 表。该sp在动态SQL循环中使用INSERT INTO tableA SELECT * FROM tableAFromSource命令,其中包含所有表名

使用这种方式,由于我们无法控制的外部因素(服务器无法链接,数据结构,在服务器等权限)

+0

你能否提供更多细节?我认为这是ETL过程的一部分,但对于这样的过程通常不需要动态SQL ......其他的事情,你有没有考虑过使用MERGE而不是INSERT呢? –

+0

@GerardoLima - 主要更新过程的细节。如何使用MERGE避免违反任何FK限制? – Mike

+0

来自MSDN“[MERGE]根据与源表的连接结果,对目标表执行插入,更新或删除操作。” [http://msdn.microsoft.com/en-us/library/bb510625(v=sql.105).aspx] –

回答

-1

我不知道任何类型的预处理,检查会是什么是任何给定查询的结果,但使用普通T-SQL检查条件通常很容易。如果你只是想避免的主键约束违反,您可以使用您所提供的查询的以下变化(考虑Id主键):

INSERT INTO tableA 
SELECT * 
FROM tableAFromSource src 
WHERE src.Id NOT IN (SELECT tba.Id FROM tableA tba);