如何在INSERT中确定导致重复输入错误的表行?

时间:2012-09-06 09:22:03

标签: 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         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

具有外键关系

存储过程无法完成抛出违反外键关系的错误消息;即t3中缺少一些条目:

  

消息547,级别16,状态0 [...] INSERT语句与之冲突   FOREIGN-KEY [..]

我想知道的是导致错误的t2的TABLE ROW ,最好是此行中的值。我搜索了很多关于SQL错误处理的信息,但只找到了提供编码行引发错误的例子 - 这对我来说是无用的信息......

任何帮助表示赞赏

6 个答案:

答案 0 :(得分:1)

错误很明显,它就像你试图在列中插入一个值,该值具有在引用表的主键列中找不到的FK约束。

从您发布的查询中,您尝试插入dbo.t2中第一个表中不存在的所有值。然后,您可以使用EXCEPT运算符仅插入col1, col2, col3, col4, col5dbo.t2dbo.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中不存在的行。

如果您想获取导致重复条目的数据,可以使用{{1}}来获取它们。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

我认为有可能在t2中你有t3中不存在的值的行。 (这就是违反参考的原因。)

确保t2仅包含t3中存在的值。

答案 3 :(得分:0)

您可以尝试在数据上使用 INNER JOIN 来删除违规行。

答案 4 :(得分:0)

使用 NOT IN

尝试此操作
  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) 

答案 5 :(得分:0)

SELECT column1, column2, column3
FROM Table2 T2
LEFT JOIN  Table1 T1 ON T1.col1 = T2.column1 and T1.col2 = T2.column2 and T1.col3=T2.column3
WHERE T1.col1 IS NULL and T1.col2 IS NULL and T1.col3 IS NULL