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

Откуда:
Сообщений: 1
Не нашел объяснения, почему в Catch то попадает, то не попадает выполнение

1. set xact_abort и DML
1.1 set xact_abort on - не пришел в Catch
1.1 set xact_abort off - пришел в Catch

2. set xact_abort и динамический DML через exec
2.1 set xact_abort on - не пришел в Catch
2.1 set xact_abort off - пришел в Catch

3. set xact_abort и DML и sp_executesql
3.1 set xact_abort on - пришел в Catch
3.1 set xact_abort off - пришел в Catch

то есть у 3 случая вообще set xact_abort не важен, что самое интересное


нашел только https://technet.microsoft.com/en-us/library/ms191515.aspx
но, насколько я понял эту статью, она мой пример не объясняет

Есть какое-нибудь (желательно документальное) подтверждение такого поведения?

Сделал тестовый пример

имеем два сервера Microsoft SQL Server 2008 R2 (SP2) - 10.50.4339.0 (X64) Mar 19 2015 13:13:39 Copyright (c) Microsoft Corporation Standard Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)

с сервера A вставляем в таблицу базы на сервере B
заведомо повторяющийся ключ, то есть

B.TestDB.dbo.Docs (id primary key)

пример

print '1.1___________'
DECLARE @ErrorMessage NVARCHAR(4000);
DECLARE @ErrorSeverity INT;
DECLARE @ErrorState INT;
		
set xact_abort on
begin try
 begin tran
   INSERT INTO OPENDATASOURCE('SQLNCLI',
					'Data Source=B;Integrated Security=SSPI').TestDB.dbo.Docs
					(ID)
	SELECT top 1 id 
	from OPENDATASOURCE('SQLNCLI',
					'Data Source=B;Integrated Security=SSPI').TestDB.dbo.Docs


 commit tran
end try
begin catch

SELECT 
  @ErrorMessage = ERROR_MESSAGE(),
  @ErrorSeverity = ERROR_SEVERITY(),
  @ErrorState = ERROR_STATE();
			
  RAISERROR('Error from catch:', @ErrorSeverity, @ErrorState,
				  @ErrorMessage, @ErrorSeverity, @ErrorState)

end catch

go
print '1.2___________'
DECLARE @ErrorMessage NVARCHAR(4000);
DECLARE @ErrorSeverity INT;
DECLARE @ErrorState INT;
		
set xact_abort off
begin try
 begin tran
   INSERT INTO OPENDATASOURCE('SQLNCLI',
					'Data Source=B;Integrated Security=SSPI').TestDB.dbo.Docs
					(ID)
	SELECT top 1 id 
	from OPENDATASOURCE('SQLNCLI',
					'Data Source=B;Integrated Security=SSPI').TestDB.dbo.Docs


 commit tran
end try
begin catch

SELECT 
  @ErrorMessage = ERROR_MESSAGE(),
  @ErrorSeverity = ERROR_SEVERITY(),
  @ErrorState = ERROR_STATE();
			
  RAISERROR('Error from catch:', @ErrorSeverity, @ErrorState,
				  @ErrorMessage, @ErrorSeverity, @ErrorState)

end catch
go
print '2.1___________'
DECLARE @ErrorMessage NVARCHAR(4000);
DECLARE @ErrorSeverity INT;
DECLARE @ErrorState INT;

declare @sql varchar(max)

set @sql='INSERT INTO OPENDATASOURCE(''SQLNCLI'',
					''Data Source=B;Integrated Security=SSPI'').TestDB.dbo.Docs
					(ID)
	SELECT top 1 id 
	from OPENDATASOURCE(''SQLNCLI'',
					''Data Source=B;Integrated Security=SSPI'').TestDB.dbo.Docs

	  '	
set xact_abort on
begin try
 begin tran
   
   exec (@sql)

 commit tran
end try
begin catch

SELECT 
  @ErrorMessage = ERROR_MESSAGE(),
  @ErrorSeverity = ERROR_SEVERITY(),
  @ErrorState = ERROR_STATE();
			
  RAISERROR('Error from catch:', @ErrorSeverity, @ErrorState,
				  @ErrorMessage, @ErrorSeverity, @ErrorState)

end catch
go
print '2.2___________'
DECLARE @ErrorMessage NVARCHAR(4000);
DECLARE @ErrorSeverity INT;
DECLARE @ErrorState INT;

declare @sql varchar(max)

set @sql='INSERT INTO OPENDATASOURCE(''SQLNCLI'',
					''Data Source=B;Integrated Security=SSPI'').TestDB.dbo.Docs
					(ID)
	SELECT top 1 id 
	from OPENDATASOURCE(''SQLNCLI'',
					''Data Source=B;Integrated Security=SSPI'').TestDB.dbo.Docs

	  '	
set xact_abort off
begin try
 begin tran
   
   exec (@sql)

 commit tran
end try
begin catch

SELECT 
  @ErrorMessage = ERROR_MESSAGE(),
  @ErrorSeverity = ERROR_SEVERITY(),
  @ErrorState = ERROR_STATE();
			
  RAISERROR('Error from catch:', @ErrorSeverity, @ErrorState,
				  @ErrorMessage, @ErrorSeverity, @ErrorState)

end catch
go
print '3.1___________'
DECLARE @ErrorMessage NVARCHAR(4000);
DECLARE @ErrorSeverity INT;
DECLARE @ErrorState INT;

declare @sql varchar(max)

set @sql='INSERT INTO OPENDATASOURCE(''SQLNCLI'',
					''Data Source=B;Integrated Security=SSPI'').TestDB.dbo.Docs
					(ID)
	SELECT top 1 id 
	from OPENDATASOURCE(''SQLNCLI'',
					''Data Source=B;Integrated Security=SSPI'').TestDB.dbo.Docs

	  '	
set xact_abort on
begin try
 begin tran
   
   exec sp_executesql @sql
  
 commit tran
end try
begin catch

SELECT 
  @ErrorMessage = ERROR_MESSAGE(),
  @ErrorSeverity = ERROR_SEVERITY(),
  @ErrorState = ERROR_STATE();
			
  RAISERROR('Error from catch:', @ErrorSeverity, @ErrorState,
				  @ErrorMessage, @ErrorSeverity, @ErrorState)

end catch
go
print '3.2___________'
DECLARE @ErrorMessage NVARCHAR(4000);
DECLARE @ErrorSeverity INT;
DECLARE @ErrorState INT;

declare @sql varchar(max)

set @sql='INSERT INTO OPENDATASOURCE(''SQLNCLI'',
					''Data Source=B;Integrated Security=SSPI'').TestDB.dbo.Docs
					(ID)
	SELECT top 1 id 
	from OPENDATASOURCE(''SQLNCLI'',
					''Data Source=B;Integrated Security=SSPI'').TestDB.dbo.Docs

	  '	
set xact_abort off
begin try
 begin tran
   
   exec sp_executesql @sql
  
 commit tran
end try
begin catch

SELECT 
  @ErrorMessage = ERROR_MESSAGE(),
  @ErrorSeverity = ERROR_SEVERITY(),
  @ErrorState = ERROR_STATE();
			
  RAISERROR('Error from catch:', @ErrorSeverity, @ErrorState,
				  @ErrorMessage, @ErrorSeverity, @ErrorState)

end catch
8 апр 16, 20:29    [19034948]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить