2015-03-15 5 views
0

Я использую SQL Server 2012разница в вставке значений в SQL Server

Этот запрос:

drop table x 
create table x(id int primary key) 

insert into x values(5) 
insert into x values(6) 

begin tran 
insert into x values(1),(2),(3),(3),(4)--Primary key violation 
commit tran 

select* from x 

Это возвращает

5 
6 

и другой запрос

drop table x 
create table x(id int primary key) 

insert into x values(5) 
insert into x values(6) 

begin tran 
insert into x values(1) 

insert into x values(2) 
insert into x values(3) 
insert into x values(3) --Primary key violation 
insert into x values (4) 
commit tran 

select * from x 

Это возвращает

1 
2 
3 
4 
5 
6 

В чем разница в вставке значений в SQL Server?

Между этими двумя запросами и почему разные результирующие наборы?

+0

Вы также можете проверить XACT_ABORT: https: // MSDN .microsoft.com/EN-US/библиотека/ms188792.aspx –

ответ

0

Образец 1 имеет инструкцию для одной вставки для 1,2,3,3,4,5. Это «массовый» оператор вставки (однако SQL Server использует термин «объемная вставка» другим способом). По сути, это означает, что все вставки в этой строке выполняются как одно единственное действие.

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

0

SQL-сервер выполняет запросы в виде пакетов. Поэтому, если в пакете возникает ошибка, according to MSDN, возможно одно следующее.

  • Выполнение каких-либо утверждений в партии не выполняется.
  • Операций в пакете не выполняется и транзакция откатывается назад.
  • Выполняются все операторы перед операцией ошибки.
  • Выполняются все утверждения, за исключением оператора ошибки.

В вашем первом случае «Операции в партии не выполняются». И в вашем втором случае: «Все утверждения, кроме оператора ошибки или выполнены».

Более подробную информацию о пакетах SQL, пожалуйста, обратитесь в следующих статьях MSDN,

Смежные вопросы