Хотя мой категорический совет для вас состоит в том, чтобы структурировать sql так, чтобы не пытаться повторять вставки (фрагмент кода Филипа Келли, вероятно, вам нужен), я хочу отметить, что ошибка в выражении не обязательно вызывает откат.
Если XACT_ABORT
не равно ON
, транзакция не будет автоматически откатываться, если возникнет ошибка, если она не будет достаточно серьезной для разрыва соединения. XACT_ABORT
по умолчанию OFF
.
Например, следующий sql успешно вставляет три значения в таблицу:
create table x ( y int not null primary key )
begin transaction
insert into x(y)
values(1)
insert into x(y)
values(2)
insert into x(y)
values(2)
insert into x(y)
values(3)
commit
Если вы не установили XACT_ABORT
, на клиенте возникает ошибка, вызывающая откат. Если по какой-то ужасной причине вы не можете избежать вставки дубликатов, вы должны иметь возможность перехватить ошибку на клиенте и игнорировать ее.