Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
ВладимирЛ 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] Ответить | Цитировать Сообщить модератору |
ВладимирЛ Member Откуда: Сообщений: 69 |
Вдгогонку: Да - тут знающие люди подскажут, что достаточно второй оператор написать в виде: Insert into @tbl02 (id) Select id From @tbl01 Group By id Но по условию задачи - этих insert несколько - то есть первый накидал записей, а второй insert со своим набором уже дает конфликт по ключу |
29 дек 13, 09:46 [15360915] Ответить | Цитировать Сообщить модератору |
o-o
Guest |
заменить PK на NOT NULL + уникальный индекс, в к-ом включить IGNORE_DUP_KEY ON |
29 дек 13, 11:46 [15360999] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
Потому что таков один из приципов тарнзакции - все или ничего
Ну так напишите одной. Что мешает выбрать те записи, которых нет в целевлй таблице ? |
||||
29 дек 13, 12:27 [15361054] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
ВладимирЛ Member Откуда: Сообщений: 69 |
Jaffar, Спасибо - это вот как раз просто и изящно!!! А в Accesse - там помниться да, можно было игнорировать ошибочные вставки |
30 дек 13, 14:06 [15364801] Ответить | Цитировать Сообщить модератору |
Jaffar Member Откуда: Сообщений: 633 |
но это только частный случай с одним полем. в общем случае таким образом отбраковать ошибки неполучиться, разве что в цикле вставлять построчно обернув в try catch. |
||
30 дек 13, 14:20 [15364871] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |