Вставьте значения или проигнорируйте строку, если ограничение не выполнено

В 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 ответа

Решение

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

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

Другие вопросы по тегам