powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / nocount on, print и try..catch через linked server
11 сообщений из 11, страница 1 из 1
nocount on, print и try..catch через linked server
    #40097436
sergio2021
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет!
Столкнулся с непонятной для меня ситуацией.

Задача: Нужно отловить ошибку в блоке try..catch.

Сценарий:
два MSSQL (15.0.4153.1) соединение через ( SQLNCLI или MSOLEDBSQL )
на сервере А процедура с ошибкой выполнения

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
create procedure dbo.p_A as
  set nocount, xact_abort on

  begin try

  print 'перед ошибкой'
  raiserror( 'ошибка на сервере А', 18, 1 )
  print 'после ошибки - выполняться не будет'

  end try
  begin catch
    ;throw
  end catch
go



на сервере Б делаем ее вызов в блоке try..catch

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
begin try
print 'перед выполнением'
exec A..dbo.p_A
print 'после выполнения'
end try
begin catch
  print 'словили ошибку'
end catch



в результате ошибка не отлавливается, то есть нет сообщения 'словили ошибку'.
но если убрать print или set nocount on перед raiserror в процедуре на сервере А, то все работает как надо!
...
Рейтинг: 0 / 0
nocount on, print и try..catch через linked server
    #40097484
Фотография komrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sergio2021,

попробуйте

Код: sql
1.
exec ('exec db.dbo.p_A') at [A]



или

Код: sql
1.
select * from OPENQUERY([A], 'exec db.dbo.p_A');
...
Рейтинг: 0 / 0
nocount on, print и try..catch через linked server
    #40097492
sergio2021
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
komrad,

так уже пробовал.

конечно есть решение сделать процедуру обёртки

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
create procedure dbo.p_A_cover as
  begin try
  exec dbo.p_A

  end try
  begin catch
    ;throw
  end catch
go



и вызывать ее
Но хотел бы понять природу ошибки. И найти другое решение.
...
Рейтинг: 0 / 0
nocount on, print и try..catch через linked server
    #40097576
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sergio2021
Всем привет!
Столкнулся с непонятной для меня ситуацией.

Задача: Нужно отловить ошибку в блоке try..catch.

...
в результате ошибка не отлавливается, то есть нет сообщения 'словили ошибку'.
но если убрать print или set nocount on перед raiserror в процедуре на сервере А, то все работает как надо!


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
begin try
begin
	print 'перед выполнением'
	exec ('begin try execute tempdb.dbo.p_A end try begin catch ;throw end catch') at [(LOCAL)]
	print 'после выполнения '
end
end try
begin catch
begin
  print 'словили ошибку: ' + error_message()
end
end catch
...
Рейтинг: 0 / 0
nocount on, print и try..catch через linked server
    #40097638
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sergio2021,

используйте return для возврата ошибки.
...
Рейтинг: 0 / 0
nocount on, print и try..catch через linked server
    #40097644
sergio2021
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
HandKot,

Спасибо, но это таже обертка но с другой стороны.


Владислав Колосов,

ретурн получается, только если подавить экцепшн.

Код: sql
1.
2.
3.
4.
...
begin catch
  return -1
end catch



тогда сработает:

Код: sql
1.
2.
declare @R int
exec @R = A..dbo.p_A



но мне нужно отловить текст ошибки.
...
Рейтинг: 0 / 0
nocount on, print и try..catch через linked server
    #40097734
Uridian
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sergio2021

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
create procedure dbo.p_A as
  set nocount, xact_abort on

  begin try

  print 'перед ошибкой'
  raiserror( 'ошибка на сервере А', 18, 1 )
  print 'после ошибки - выполняться не будет'

  end try
  begin catch
    ;throw
  end catch
go




Инструкция THROW учитывает SET XACT_ABORT . Инструкция RAISERROR — нет. В новых приложениях следует использовать инструкцию THROW вместо RAISERROR.
...
Рейтинг: 0 / 0
nocount on, print и try..catch через linked server
    #40097758
sergio2021
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Uridian,

Не помогает(

https://www.sommarskog.se/error_handling/Appendix1.html
вот здесь есть:

Erland SommarskogSo more in general, if you have a remote procedure that runs with SET NOCOUNT ON and first produces an informational message (for instance with PRINT) and then produces an error, you cannot trap this error with TRY-CATCH in your local procedure.

видимо нужно избавляться от PRINT.
...
Рейтинг: 0 / 0
nocount on, print и try..catch через linked server
    #40097774
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sergio2021,

возвращайте код ошибки с минусом.
...
Рейтинг: 0 / 0
nocount on, print и try..catch через linked server
    #40097826
sergio2021
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Владислав Колосов,

уже пробовал, см. выше. Не помогает.
...
Рейтинг: 0 / 0
nocount on, print и try..catch через linked server
    #40097899
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sergio2021,

напишите разные коды для пользовательских ошибок, системные и так уже пронумерованы. Неужели так сложно? Сопоставьте коды и тексты.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / nocount on, print и try..catch через linked server
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]