Sql 如何确定导致INSERT中重复条目错误的表行?

Sql 如何确定导致INSERT中重复条目错误的表行?,sql,sql-server,sql-server-2005,error-handling,foreign-key-relationship,Sql,Sql Server,Sql Server 2005,Error Handling,Foreign Key Relationship,我得到了很多答案,试图帮助我克服错误: 我最感兴趣的是一种执行错误处理和检测创建错误的表行的方法,而不是绕过我的实际问题,我只使用它来说明存储过程中的代码 我正在存储过程中执行SQL Insert语句,以查找表中缺少的条目: INSERT INTO dbo.t1 (col1, col2, col3, col4, col5) SELECT DISTINCT col1, col2, col3, col4, col5 FROM

我得到了很多答案,试图帮助我克服错误: 我最感兴趣的是一种执行错误处理和检测创建错误的表行的方法,而不是绕过我的实际问题,我只使用它来说明存储过程中的代码


我正在存储过程中执行SQL Insert语句,以查找表中缺少的条目:

INSERT INTO dbo.t1
                      (col1, col2, col3, col4, col5)
    SELECT DISTINCT col1, col2, col3, col4, col5
    FROM         dbo.t2
    WHERE     (NOT EXISTS
                          (SELECT     col1, col2, col3, col4, col5
                            FROM      t1 AS Table_1
                            WHERE     (col1 = t2.col1) AND 
                                      (col2 = t2.col2) AND
                                      (col3 = t2.col3) AND
                                      (col4 = t2.col4) AND
                                      (col5 = t2.col5))) AND
                                       col2 = 'VALUE'
t1.col1+t1.col2和t1.col3+t1.col4与另一个表t3.col1+t3.col2具有外键关系

存储过程未能完成抛出违反外键关系的错误消息;i、 e.t3中缺少一些条目:

Msg 547,级别16,状态0[…]INSERT语句与冲突 外键

我想知道的是导致错误的t2表行,最好是这一行中的值。我在谷歌上搜索了很多关于SQL错误处理的信息,但只找到了一些提供引起错误的代码行的示例——这对我来说是无用的信息


任何帮助

错误都非常清楚,就像您试图在具有FK约束的列中插入一个在引用表的主键列中找不到的值一样

INSERT INTO dbo.t1(col1, col2, col3, col4, col5)
SELECT DISTINCT col1, col2, col3, col4, col5
FROM dbo.t2 left join dbo.t1
on t2.col1=t1.col1 and
   t2.col2=t1.col2 and
   t2.col3=t1.col3 and
   t2.col4=t1.col4 and
   t2.col5=t1.col5 
where t1.col1 is null and t1.col2 is null and t1.col3 is null and t1.col4 is null and t1.col5 is null
从发布的查询中,您正在尝试插入第一个表中不存在的
dbo.t2
中的所有值。然后,您可以使用运算符仅插入在
dbo.t2
中找到的
col1、col2、col3、col4、col5
的值,这些值在
dbo.t1
中不存在,例如:

INSERT INTO dbo.t1
                  (col1, col2, col3, col4, col5)
SELECT * FROM
(
    SELECT col1, col2, col3, col4, col5
    FROM         dbo.t2
    EXCEPT 
    col1, col2, col3, col4, col5
    FROM         dbo.t1
)
这样可以保证只插入
dbo.t1
中不存在的行


如果要获取导致重复条目的数据,可以使用
INTERSECT
来获取这些数据。

错误非常明显,就像您试图在引用表的主键列中找不到FK约束的列中插入值一样

从发布的查询中,您正在尝试插入第一个表中不存在的
dbo.t2
中的所有值。然后,您可以使用运算符仅插入在
dbo.t2
中找到的
col1、col2、col3、col4、col5
的值,这些值在
dbo.t1
中不存在,例如:

INSERT INTO dbo.t1
                  (col1, col2, col3, col4, col5)
SELECT * FROM
(
    SELECT col1, col2, col3, col4, col5
    FROM         dbo.t2
    EXCEPT 
    col1, col2, col3, col4, col5
    FROM         dbo.t1
)
这样可以保证只插入
dbo.t1
中不存在的行


如果您想获取导致重复输入的数据,可以使用
INTERSECT
来获取这些数据。

我认为有可能,在
t2
中,您的行的值在
t3
中不存在。(这就是违反引用的原因。)


确保
t2
中只包含
t3
中存在的值我认为在
t2
中有可能包含
t3
中不存在的值的行。(这就是违反引用的原因。)


确保
t2
仅包含
t3
中存在的值您可以尝试对数据使用内部联接来删除违反的行。

您可以尝试对数据使用内部联接来删除违反的行。

使用不在中尝试此操作

  INSERT INTO TABLE_2  
 (id, name) SELECT t1.id,  t1.name   
  FROM TABLE_1 t1  WHERE t1.id NOT IN (SELECT id                        FROM TABLE_2) 

使用不在

  INSERT INTO TABLE_2  
 (id, name) SELECT t1.id,  t1.name   
  FROM TABLE_1 t1  WHERE t1.id NOT IN (SELECT id                        FROM TABLE_2) 

嗨,马哈茂德,谢谢你提出的解决方案。尽管如此,我不想知道如何停止查询以抛出错误,但我想知道哪个表行(T2)正在创建错误。我想捕获存储例程中的错误,然后创建一个输出,告诉我它停止的行。@WolfiG,啊哈,我认为这是不可能的。因为如果出现问题,插入将自动回滚。你可以编辑你的问题,并解释更多细节,以便其他用户可以在这方面帮助你。嗨,马哈茂德,谢谢你建议的解决方案。尽管如此,我不想知道如何停止查询以抛出错误,但我想知道哪个表行(T2)正在创建错误。我想捕获存储例程中的错误,然后创建一个输出,告诉我它停止的行。@WolfiG,啊哈,我认为这是不可能的。因为如果出现问题,插入将自动回滚。您可以编辑您的问题并解释更多细节,以便其他用户可以在这方面帮助您。嗨,Andreas,谢谢您的评论。尽管如此,我不想知道如何停止查询以抛出错误,但我想知道哪个表行(T2)正在创建错误。我希望捕获存储例程中的错误,然后创建一个输出,告诉我它停止的行。这就是我想找出t3中缺少哪些条目的方法。@WolfiG:我认为最好编写一个这样的简单联接:从t2左选择*在t2.col1=t3.col1和t2.col2=t3.col2上联接t3,其中t3.col1为空,这样可以找到这些记录。否则,您将面临错误处理方面的一些困难问题,但也可以尝试使用CATCHHi Andreas,谢谢您的评论。尽管如此,我不想知道如何停止查询以抛出错误,但我想知道哪个表行(T2)正在创建错误。我希望捕获存储例程中的错误,然后创建一个输出,告诉我它停止的行。这就是我想找出t3中缺少哪些条目的方法。@WolfiG:我认为最好编写一个这样的简单联接:从t2左选择*在t2.col1=t3.col1和t2.col2=t3.col2上联接t3,其中t3.col1为空,这样可以找到这些记录。除此之外,您在错误处理方面会遇到一些困难,但也有可能使用TRY catchi Kapil,这与其他乐于助人的同事一样:对我来说,避开错误并不重要。我想知道在这种情况下我是如何发现导致错误的行的。我是