Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何设置合并操作以在出错后继续执行_Sql_Sql Server_Merge - Fatal编程技术网

Sql 如何设置合并操作以在出错后继续执行

Sql 如何设置合并操作以在出错后继续执行,sql,sql-server,merge,Sql,Sql Server,Merge,我是否可以设置合并操作以在约束失败后继续执行,例如尝试插入null、FK或PK?我有一个简单的合并 MERGE Test1 AS t1 USING Test2 AS t2 ON t1.a = t2.d WHEN NOT MATCHED BY TARGET THEN INSERT(a, b, c) VALUES(d, e, f) 我已经看到,在Oracle DB中,可以在合并后放入[LOG ERRORS]指令,以便跳过前N个错误并只记录它们: LO

我是否可以设置合并操作以在约束失败后继续执行,例如尝试插入null、FK或PK?我有一个简单的合并

MERGE Test1 AS t1
USING Test2 AS t2
ON t1.a = t2.d
WHEN NOT MATCHED BY TARGET
    THEN 
        INSERT(a, b, c)
        VALUES(d, e, f)   
我已经看到,在Oracle DB中,可以在合并后放入[LOG ERRORS]指令,以便跳过前N个错误并只记录它们:

LOG ERRORS INTO TAB_ERR_COPY_EMP('TAG_STATEMENT') REJECT LIMIT 100;
我可以在SQL SERVER 2016 SP1上采用类似的解决方法吗?或者总体来说,这是一种不好的做法吗


为什么我需要它-我正在尝试创建一个可定制的合并(有N个表和N个字段),以便与其他系统进行日常集成,有时可能会有不同类型的不同数据,或者不满足某些FKs。因此,我想跳过一些有问题的字段,但集成了我的大部分数据。

SQL Server对
MERGE
(或任何其他语句)没有这样的规定。您可以手动向
MATCHED
/
NOT MATCHED
子句添加条件,以将特定错误重定向到新表中,但这通常不会捕获所有错误。使用客户端代码(如集成服务)可以更好地处理此类高级场景;T-SQL过于严格,提供的钩子太少,无法检查有问题的数据。如果必须使用T-SQL,最好使用多个
INSERT
/
DELETE
阶段来过滤数据(必要时包装在事务中);单一的
合并
太雄心勃勃了。看看这个帖子:。@Sorix,谢谢,我看过这篇文章,但是我想这两种方法都不适合我-“逐行”需要花费大量时间来处理>10000k行和我们在这台服务器上不使用的SSI。我曾考虑编写一些T-SQL过程,这些过程对于未来的开发人员来说很容易阅读和维护。@Jeroenmoster,谢谢,我正在考虑T-SQL选项,我将尝试实现
批量插入
,因为它提供了可以工作的MAXERRORS,我希望可能不会——根据文档,
MAXERRORS
不适用于约束检查。当然,您可以在批量加载时忽略约束,然后进行检查,但菜单上不会显示基于约束冲突而丢弃的内容。