2011-11-16 36 views
2

在SQL Server 2008中,是否有插入行的方法,同時省略導致外鍵約束失敗的那些行?如果約束失敗,插入值或忽略行

E.g.我有一個類似於此的插入語句:

insert into tblFoo(id, name, parent_id, desc) values 
(1, 'a', 1, null), 
(2, 'c', 3, 'blah'), 
....; 

parent_id是fk到另一個表。那我怎麼才能讓sql server跳過那些fk列無效的行呢?

更新我想讓它自動工作,而不必先過濾掉那些違反fk約束的行。原因是因爲插入語句是由程序生成的,所以事先並不知道每個表上存在哪些外鍵。

回答

2

是一個奇怪的情況,你到達那裏,但你可以插入到臨時表的值,然後選擇只有有效的FK值。

類似:

declare @tempTable table (
    id int, 
    name nvarchar(50) , 
    parent_id int , 
    [desc] nvarchar(50) 
) 

insert into @tempTable values 
(1, 'a', 1, null), 
(2, 'c', 3, 'blah') 

insert into tblFoo(id, name, parent_id, [desc]) 
select tempTable.* from @tempTable as tempTable 
inner join parent_id on parent_id.id = tempTable.parent_id 
+0

+1 INNER JOIN to parentTable on id可能稍微更優化。不過這是一個很好的解決方案。 – brian

+0

@brian我編輯了答案以反映您的優化 – dcarneiro

1

一種方法是在插入和更新使用觸發器的,而不是。然後,您可以在實際寫入數據庫之前評估每個正在更新的行。我通常不是觸發器的巨大粉絲,但是您似乎在這裏有一個不尋常的要求。