Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Insert - пропустить ошибки и вставить остальное  [new]
ВладимирЛ
Member

Откуда:
Сообщений: 69
Добрый день!
Казалось на уровне "простого пользователя" про t-sql знаю немало, но неожиданно столкнулся с таким простым кодом:

Declare @tbl01 table (id int)
Insert @tbl01 (id) values(1),(2),(2)

Declare @tbl02 table (id int primary key)
begin try
Insert into @tbl02 (id) Select id From @tbl01
end try
begin catch
end catch
Select * From @tbl02 -- пустая табличка

Необходимо, чтобы в @tbl02 было вставлено 1 и 2, а еще одну 2 - ну ошибка и ошибка, ее проигнорировать.
Выяснилось, что при возникновении ошибки вставка полностью откатывется !!??
Конечно, возможны варианты с построчным прохождением первой таблицы и построчной же вставкой во вторую, но хотелось бы коротко и одной командой.
Вопрос: возможно ли эту проблему преодолеть изячно, может есть какие-нибудь SETы на игнорирование ошибок и пр.???
C Уважением = Л.Владимир
29 дек 13, 09:40    [15360912]     Ответить | Цитировать Сообщить модератору
 Re: Insert - пропустить ошибки и вставить остальное  [new]
ВладимирЛ
Member

Откуда:
Сообщений: 69
Вдгогонку:
Да - тут знающие люди подскажут, что достаточно второй оператор написать в виде:
Insert into @tbl02 (id) Select id From @tbl01 Group By id
Но по условию задачи - этих insert несколько - то есть первый накидал записей, а второй insert со своим набором уже дает конфликт по ключу
29 дек 13, 09:46    [15360915]     Ответить | Цитировать Сообщить модератору
 Re: Insert - пропустить ошибки и вставить остальное  [new]
o-o
Guest
заменить PK на NOT NULL + уникальный индекс,
в к-ом включить IGNORE_DUP_KEY ON
29 дек 13, 11:46    [15360999]     Ответить | Цитировать Сообщить модератору
 Re: Insert - пропустить ошибки и вставить остальное  [new]
Glory
Member

Откуда:
Сообщений: 104760
ВладимирЛ
Выяснилось, что при возникновении ошибки вставка полностью откатывется !!??

Потому что таков один из приципов тарнзакции - все или ничего
ВладимирЛ
Конечно, возможны варианты с построчным прохождением первой таблицы и построчной же вставкой во вторую, но хотелось бы коротко и одной командой.

Ну так напишите одной.
Что мешает выбрать те записи, которых нет в целевлй таблице ?
29 дек 13, 12:27    [15361054]     Ответить | Цитировать Сообщить модератору
 Re: Insert - пропустить ошибки и вставить остальное  [new]
Jaffar
Member

Откуда:
Сообщений: 633
В данном случае поможет это:
insert into table_1(ID)
select distinct t2.ID -- <-- ЭТО
from table_2 t2
where
          not exists(select 1 from table_1 t1 where t1.ID = t2.ID) -- <-- и ЭТО
30 дек 13, 06:56    [15363076]     Ответить | Цитировать Сообщить модератору
 Re: Insert - пропустить ошибки и вставить остальное  [new]
ВладимирЛ
Member

Откуда:
Сообщений: 69
Jaffar,
Спасибо - это вот как раз просто и изящно!!!
А в Accesse - там помниться да, можно было игнорировать ошибочные вставки
30 дек 13, 14:06    [15364801]     Ответить | Цитировать Сообщить модератору
 Re: Insert - пропустить ошибки и вставить остальное  [new]
Jaffar
Member

Откуда:
Сообщений: 633
ВладимирЛ
Jaffar,
Спасибо - это вот как раз просто и изящно!!!
А в Accesse - там помниться да, можно было игнорировать ошибочные вставки



но это только частный случай с одним полем.
в общем случае таким образом отбраковать ошибки неполучиться, разве что в цикле вставлять построчно обернув в try catch.
30 дек 13, 14:20    [15364871]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить