因为我得到了很多答案,试图帮助我解决错误: 我最感兴趣的是方法来进行错误处理并检测表行创建错误,而不是解决我实际问题,我只用它来说明存储过程中编码的内容。
我正在存储过程中对表中缺少的条目执行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错误处理的信息,但只找到了提供编码行引发错误的例子 - 这对我来说是无用的信息......
任何帮助表示赞赏
答案 0 :(得分: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
中不存在的行。
如果您想获取导致重复条目的数据,可以使用{{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