Вставьте значения или проигнорируйте строку, если ограничение не выполнено - PullRequest
3 голосов
/ 16 ноября 2011

В SQL Server 2008, есть ли способ вставить строки, пропуская те строки, которые вызывают сбой ограничения внешнего ключа?

Например, у меня есть оператор вставки, подобный следующему:

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

parent_id - это fk для другой таблицы.Как я могу заставить сервер sql пропускать строки, в которых столбец fk недопустим?

Обновление Я бы хотел, чтобы это работало автоматически, без предварительной фильтрации тех строк, которые нарушают ограничение fk.Причина этого заключается в том, что операторы вставки генерируются программой, поэтому заранее неизвестно, какие внешние ключи существуют в каждой таблице.

Ответы [ 2 ]

2 голосов
/ 16 ноября 2011

Странная ситуация, с которой вы столкнулись, но вы можете вставить значения во временную таблицу и затем выбрать только значения с допустимым 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
1 голос
/ 16 ноября 2011

Один из способов - использовать триггер вместо для вставок и обновлений. Затем вы можете оценить каждую строку, обновляемую до фактической записи в БД. Как правило, я не большой поклонник триггеров, но у вас здесь необычное требование.

...