1

当我得到很多试图帮助我解决错误的答案时:我最感兴趣的是一种进行错误处理和检测表行创建错误的方法,而不是解决我只用来说明什么的实际问题在存储过程中编码。


我正在为表中缺少的条目在存储过程中执行 SQL 插入语句:

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 导致错误,最好是该行中的值。我在 Google 上搜索了很多关于 SQL 错误处理的信息,但只找到了提供引发错误的编码行的示例——这对我来说是无用的信息......

任何帮助表示赞赏

4

6 回答 6

1

该错误非常明显,它看起来像是您试图在具有 FK 约束的列中插入一个值,该值在引用表的主键列中找不到。

从您发布的查询中,您尝试插入dbo.t2第一个表中不存在的所有值。然后,您可以使用EXCEPT运算符仅插入在col1, col2, col3, col4, col5中找到的值,这些值在以下dbo.t2内容中不存在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来获取它们。

于 2012-09-06T09:30:58.660 回答
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
于 2012-09-06T09:30:48.617 回答
0

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

确保它t2只有存在于t3.

于 2012-09-06T09:32:03.820 回答
0

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

于 2012-09-06T09:33:22.383 回答
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) 
于 2012-09-06T09:35:08.300 回答
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
于 2012-09-06T10:00:36.103 回答