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

Откуда: Екатеринбург
Сообщений: 205
Добрый день.
Тест.
Подготовка данных:
-- Запуск на Linked-сервере
create proc trycatch
as
  select 1/ 0;
go


Вызов локально:
begin try

  declare @cmd nvarchar( 4000 );
  set @cmd = 'exec trycatch';
  exec [MSSQL2012].master.sys.sp_executesql @cmd

end try
begin catch
  print 'catched'
end catch


Управление в блок catch не передается.
Результат: "Divide by zero error encountered".

Меняю способ вызова удаленной ХП:
begin try

  exec ( 'exec trycatch' ) at [MSSQL2012]

end try
begin catch
  print 'catched'
end catch

Результат: catched.
Такое же поведение при вызове через openrowset/openquery.

Понимаю, что для первого примера можно добавить "set xact_abort on" для отлова ошибки.
Но все-таки, в чем разница? Почему при разных способах вызова ХП поведение try/catch разное.
Заранее спасибо!
27 июл 16, 10:19    [19460281]     Ответить | Цитировать Сообщить модератору
 Re: Разница при работе с linked-сервером  [new]
Pavel1211
Member

Откуда: Екатеринбург
Сообщений: 205
Pavel1211,

Локальный сервер:
Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (X64) 
	Apr  2 2010 15:48:46 
	Copyright (c) Microsoft Corporation
	Enterprise Edition (64-bit) on Windows NT 6.2 <X64> (Build 9200: )


Linked:
Microsoft SQL Server 2012 - 11.0.2100.60 (X64) 
	Feb 10 2012 19:39:15 
	Copyright (c) Microsoft Corporation
	Enterprise Edition (64-bit) on Windows NT 6.2 <X64> (Build 9200: )
27 июл 16, 10:22    [19460305]     Ответить | Цитировать Сообщить модератору
 Re: Разница при работе с linked-сервером  [new]
o-o
Guest
пардон, а почему не вызвать напрямую вот так:
exec [MSSQL2012].master.sys.trycatch
27 июл 16, 11:22    [19460774]     Ответить | Цитировать Сообщить модератору
 Re: Разница при работе с linked-сервером  [new]
o-o
Guest
ну т.е. там конечно не sys и база наверное не мастер,
ну в общем
exec [MSSQL2012].my_db.dbo.trycatch

-- издержки копипаста
27 июл 16, 11:24    [19460793]     Ответить | Цитировать Сообщить модератору
 Re: Разница при работе с linked-сервером  [new]
Pavel1211
Member

Откуда: Екатеринбург
Сообщений: 205
o-o,

Да там в оригинальном коде свои издержки, связанные с динамикой.

Я просто всегда думал, что используется один и тот же способ взаимодействия между серверами с разным синтаксисом.
Один драйвер, одни настройки.
А тут, получается, не все так просто.
Интересуют, как обычно, кишки :)
27 июл 16, 11:41    [19460958]     Ответить | Цитировать Сообщить модератору
 Re: Разница при работе с linked-сервером  [new]
o-o
Guest
вы не поверите, но у меня хоть так, хоть сяк ловится.
оба сервера
version
Microsoft SQL Server 2008 R2 (SP3) - 10.50.6000.34 (Intel X86) Aug 19 2014 12:21:07 Copyright (c) Microsoft Corporation Developer Edition on Windows NT 6.1 <X86> (Build 7601: Service Pack 1)


К сообщению приложен файл. Размер - 47Kb
27 июл 16, 11:55    [19461131]     Ответить | Цитировать Сообщить модератору
 Re: Разница при работе с linked-сервером  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8353
Что-то там с SET ANSI не так, наверное.
27 июл 16, 11:57    [19461150]     Ответить | Цитировать Сообщить модератору
 Re: Разница при работе с linked-сервером  [new]
смотрю_тут
Member

Откуда:
Сообщений: 1368
Владислав Колосов,

Драйвера кстати одни и те же используете ?
27 июл 16, 12:01    [19461191]     Ответить | Цитировать Сообщить модератору
 Re: Разница при работе с linked-сервером  [new]
o-o
Guest
ловится и в паре локальный 2008 R2, версия выше,
линкед
version
Microsoft SQL Server 2012 - 11.0.5569.0 (Intel X86) Jan 9 2015 11:41:41 Copyright (c) Microsoft Corporation Developer Edition on Windows NT 6.1 <X86> (Build 7601: Service Pack 1)
27 июл 16, 12:05    [19461234]     Ответить | Цитировать Сообщить модератору
 Re: Разница при работе с linked-сервером  [new]
орфы
Guest
а если попробовать через linked server настроенный через ODBC, то
begin try
	exec ( 'exec trycatch' ) at [ODBC SQL Server]
end try
begin catch
	print 'catched'
end catch

OLE DB provider "MSDASQL" for linked server "ODBC SQL Server" returned message "[Microsoft][ODBC SQL Server Driver][SQL Server]Divide by zero error encountered.".
catched
27 июл 16, 12:07    [19461253]     Ответить | Цитировать Сообщить модератору
 Re: Разница при работе с linked-сервером  [new]
Pavel1211
Member

Откуда: Екатеринбург
Сообщений: 205
o-o,

а если в print написать:
print error_message()

?

Может у вас какая-то другая ошибка отлавливается еще до запуска ХП на linked-сервере

Если нет - будем настройки ANSI и серверов сверять, чудес не бывает же :-)
27 июл 16, 20:54    [19464415]     Ответить | Цитировать Сообщить модератору
 Re: Разница при работе с linked-сервером  [new]
Pavel1211
Member

Откуда: Екатеринбург
Сообщений: 205
o-o,

Вот мои настройки linked-сервера:
Запрос:
+
declare @fields nvarchar( 4000 )
      , @fields_2 nvarchar( 4000 )
      , @obj sysname = 'sys.servers'

select @fields = stuff( ( select  ',' + '[' + name + ']' 	 
  from sys.all_columns 
  where object_id = ( select object_id from sys.all_objects where object_id = object_id(@obj) )
  order by column_id
  for xml path('') ), 1, 1, '' )

select @fields_2 = stuff( ( select  ',' + 'cast( ' + name + ' as nvarchar(4000) ) as [' + name + ']' 	 
  from sys.all_columns 
  where object_id = ( select object_id from sys.all_objects where object_id = object_id(@obj) )
  order by column_id
  for xml path('') ), 1, 1, '' )

declare @cmd nvarchar( 4000 );

select @cmd = N'
;with cte as (
select ' + @fields_2 + ' 
from ' + @obj + '
where is_linked = 1
and name like ''%mssql2012%'' )
select [key]
     , value 
from cte
unpivot ( value 
for [key] in ( 
' + @fields + '
)
) unpvt;'

exec ( @cmd );
go

Результат:
+

key value
server_id 1
name MSSQL2012
product SQL Server
provider SQLNCLI
data_source MSSQL2012
connect_timeout 0
query_timeout 0
is_linked 1
is_remote_login_enabled 1
is_rpc_out_enabled 1
is_data_access_enabled 1
is_collation_compatible 0
uses_remote_collation 1
lazy_schema_validation 0
is_system 0
is_publisher 0
is_subscriber 0
is_distributor 0
is_nonsql_subscriber 0
is_remote_proc_transaction_promotion_enabled 1
modify_date Jul 21 2016 10:56AM
27 июл 16, 21:37    [19464574]     Ответить | Цитировать Сообщить модератору
 Re: Разница при работе с linked-сервером  [new]
o-o
Guest
вот результаты последовательно:
1 окно: сервер 2012, создание процедуры
2 окно: вызов ее вашим способом с 2008-ого линкеда
3: скрипт динамический и его пустой результат.
сейчас не буду искать, почему он выдал пусто,
вываливаю все картинкой, версии серверов внизу в окнах

К сообщению приложен файл. Размер - 103Kb
27 июл 16, 23:29    [19464977]     Ответить | Цитировать Сообщить модератору
 Re: Разница при работе с linked-сервером  [new]
o-o
Guest
капец.
в скрипте имя вашего сервера осталось.
вот теперь yce ok

К сообщению приложен файл. Размер - 13Kb
27 июл 16, 23:38    [19465017]     Ответить | Цитировать Сообщить модератору
 Re: Разница при работе с linked-сервером  [new]
Pavel1211
Member

Откуда: Екатеринбург
Сообщений: 205
o-o
2 окно: вызов ее вашим способом с 2008-ого линкеда

эээ... Ну дак у вас ошибка, получается, тоже не отловилась.
Если бы отловилась - в SSMS черным по белому было бы написано, а у вас красным по белому ))
28 июл 16, 07:41    [19465363]     Ответить | Цитировать Сообщить модератору
 Re: Разница при работе с linked-сервером  [new]
o-o
Guest
Pavel1211
o-o
2 окно: вызов ее вашим способом с 2008-ого линкеда

эээ... Ну дак у вас ошибка, получается, тоже не отловилась.
Если бы отловилась - в SSMS черным по белому было бы написано, а у вас красным по белому ))

а вчера и на рабочем писало черным по белому.
ну сейчас я тут все то же проделаю
---
картинки с красным это из дома и ночью,
а с черным это утром с работы.
системы разные
28 июл 16, 09:56    [19465759]     Ответить | Цитировать Сообщить модератору
 Re: Разница при работе с linked-сервером  [new]
Pavel1211
Member

Откуда: Екатеринбург
Сообщений: 205
o-o,

Я думаю что разница в настройках linked-серверов. RPC, например, запрещено на рабочем компе.
Мне надо было изначально в catch-е просить print ошибки выводить
28 июл 16, 09:59    [19465771]     Ответить | Цитировать Сообщить модератору
 Re: Разница при работе с linked-сервером  [new]
o-o
Guest
very funny, да.
разумеется, там черным.
ибо не доходит до выполнения

К сообщению приложен файл. Размер - 43Kb
28 июл 16, 10:04    [19465803]     Ответить | Цитировать Сообщить модератору
 Re: Разница при работе с linked-сервером  [new]
o-o
Guest
ну все, теперь rpc out true и тоже красным.
сейчас буду думать
28 июл 16, 10:08    [19465828]     Ответить | Цитировать Сообщить модератору
 Re: Разница при работе с linked-сервером  [new]
Pavel1211
Member

Откуда: Екатеринбург
Сообщений: 205
o-o,

Спасибо за подтверждение.
В итоге вернулись к тому, с чего началась тема )))
Почему sp_executesql ведет себя не так, как, к примеру, exec ( ) at.
28 июл 16, 10:31    [19465961]     Ответить | Цитировать Сообщить модератору
 Re: Разница при работе с linked-сервером  [new]
o-o
Guest
лучше так: почему четырехточечный вызов так себя ведет.
потому что и без sp_executesql, прямой вызов дает то же самое.
кстати, 2008-ой имел rpc out true.
угадайте, почему там было черным по белому.
там сиквельная авторизация "все под одним именем".
имеем The server principal "l2" is not able to access the database "cyr" under the current security context.
выходит, на этапе проверки прав еще ловится
это уже ближе к линкеду, чем linked is not configured for rpc
28 июл 16, 10:55    [19466054]     Ответить | Цитировать Сообщить модератору
 Re: Разница при работе с linked-сервером  [new]
o-o
Guest
объяснение найдено в документации: BY DESIGN (кто бы сомневался)
BOL
A TRY…CATCH construct on the local server handles remote batch abort errors only.

Handling Errors in Server-to-Server Remote Stored Procedures
т.е. если бы ошибка была BATCH ABORTING, ее бы отловил TRY…CATCH.
меняем процедуру на такую:
create proc trycatch2
as
  select cast ('a' as int);
go

получаем локально черным по белому:
TRY..CATCH
catched
Conversion failed when converting the varchar value 'a' to data type int.

а пример с 1 / 0 это всего лишь statement terminating.
проверяется засовыванием принта в тот же бэтч, где ожидается ошибка.
если по принта доходит, то это только statement terminating,
если не доходит, batch aborting
select cast ('a' as int);
print 'statement aborting only'
go

select 1/0;
print 'statement aborting only'
go
28 июл 16, 12:11    [19466664]     Ответить | Цитировать Сообщить модератору
 Re: Разница при работе с linked-сервером  [new]
Pavel1211
Member

Откуда: Екатеринбург
Сообщений: 205
o-o,
o-o
а пример с 1 / 0 это всего лишь statement terminating.

Уверены? У меня на 2008R2 не дошел до print. Только ошибку вываливает
28 июл 16, 12:50    [19466955]     Ответить | Цитировать Сообщить модератору
 Re: Разница при работе с linked-сервером  [new]
o-o
Guest
Pavel1211
o-o,
o-o
а пример с 1 / 0 это всего лишь statement terminating.

Уверены? У меня на 2008R2 не дошел до print. Только ошибку вываливает

ну и сервер у вас, какой-то уникальный!
вот обе ошибки в соседних окнах,
конечно же 1 / 0 не обрывает бэтч в отличие от конверта

К сообщению приложен файл. Размер - 58Kb
28 июл 16, 13:06    [19467088]     Ответить | Цитировать Сообщить модератору
 Re: Разница при работе с linked-сервером  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
o-o,

а пример с 1 / 0 это всего лишь statement terminating.

вообще уровень у обеих ошибок одинаковый.. 16
Error messages with a severity level of 19 or higher stop the execution of the current batc

остановки не должно быть у обоих по теории
28 июл 16, 13:09    [19467110]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить