Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
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] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
o-o
Guest |
пардон, а почему не вызвать напрямую вот так: exec [MSSQL2012].master.sys.trycatch |
27 июл 16, 11:22 [19460774] Ответить | Цитировать Сообщить модератору |
o-o
Guest |
ну т.е. там конечно не sys и база наверное не мастер, ну в общем exec [MSSQL2012].my_db.dbo.trycatch -- издержки копипаста |
27 июл 16, 11:24 [19460793] Ответить | Цитировать Сообщить модератору |
Pavel1211 Member Откуда: Екатеринбург Сообщений: 205 |
o-o, Да там в оригинальном коде свои издержки, связанные с динамикой. Я просто всегда думал, что используется один и тот же способ взаимодействия между серверами с разным синтаксисом. Один драйвер, одни настройки. А тут, получается, не все так просто. Интересуют, как обычно, кишки :) |
27 июл 16, 11:41 [19460958] Ответить | Цитировать Сообщить модератору |
o-o
Guest |
вы не поверите, но у меня хоть так, хоть сяк ловится. оба сервера
К сообщению приложен файл. Размер - 47Kb |
||
27 июл 16, 11:55 [19461131] Ответить | Цитировать Сообщить модератору |
Владислав Колосов Member Откуда: Сообщений: 8353 |
Что-то там с SET ANSI не так, наверное. |
27 июл 16, 11:57 [19461150] Ответить | Цитировать Сообщить модератору |
смотрю_тут Member Откуда: Сообщений: 1368 |
Владислав Колосов, Драйвера кстати одни и те же используете ? |
27 июл 16, 12:01 [19461191] Ответить | Цитировать Сообщить модератору |
o-o
Guest |
ловится и в паре локальный 2008 R2, версия выше, линкед
|
||
27 июл 16, 12:05 [19461234] Ответить | Цитировать Сообщить модератору |
орфы
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] Ответить | Цитировать Сообщить модератору |
Pavel1211 Member Откуда: Екатеринбург Сообщений: 205 |
o-o, а если в print написать: print error_message() ? Может у вас какая-то другая ошибка отлавливается еще до запуска ХП на linked-сервере Если нет - будем настройки ANSI и серверов сверять, чудес не бывает же :-) |
27 июл 16, 20:54 [19464415] Ответить | Цитировать Сообщить модератору |
Pavel1211 Member Откуда: Екатеринбург Сообщений: 205 |
o-o, Вот мои настройки linked-сервера: Запрос:
Результат:
|
||
27 июл 16, 21:37 [19464574] Ответить | Цитировать Сообщить модератору |
o-o
Guest |
вот результаты последовательно: 1 окно: сервер 2012, создание процедуры 2 окно: вызов ее вашим способом с 2008-ого линкеда 3: скрипт динамический и его пустой результат. сейчас не буду искать, почему он выдал пусто, вываливаю все картинкой, версии серверов внизу в окнах К сообщению приложен файл. Размер - 103Kb |
27 июл 16, 23:29 [19464977] Ответить | Цитировать Сообщить модератору |
o-o
Guest |
капец. в скрипте имя вашего сервера осталось. вот теперь yce ok К сообщению приложен файл. Размер - 13Kb |
27 июл 16, 23:38 [19465017] Ответить | Цитировать Сообщить модератору |
Pavel1211 Member Откуда: Екатеринбург Сообщений: 205 |
эээ... Ну дак у вас ошибка, получается, тоже не отловилась. Если бы отловилась - в SSMS черным по белому было бы написано, а у вас красным по белому )) |
||
28 июл 16, 07:41 [19465363] Ответить | Цитировать Сообщить модератору |
o-o
Guest |
а вчера и на рабочем писало черным по белому. ну сейчас я тут все то же проделаю --- картинки с красным это из дома и ночью, а с черным это утром с работы. системы разные |
||||
28 июл 16, 09:56 [19465759] Ответить | Цитировать Сообщить модератору |
Pavel1211 Member Откуда: Екатеринбург Сообщений: 205 |
o-o, Я думаю что разница в настройках linked-серверов. RPC, например, запрещено на рабочем компе. Мне надо было изначально в catch-е просить print ошибки выводить |
28 июл 16, 09:59 [19465771] Ответить | Цитировать Сообщить модератору |
o-o
Guest |
very funny, да. разумеется, там черным. ибо не доходит до выполнения ![]() К сообщению приложен файл. Размер - 43Kb |
28 июл 16, 10:04 [19465803] Ответить | Цитировать Сообщить модератору |
o-o
Guest |
ну все, теперь rpc out true и тоже красным. сейчас буду думать |
28 июл 16, 10:08 [19465828] Ответить | Цитировать Сообщить модератору |
Pavel1211 Member Откуда: Екатеринбург Сообщений: 205 |
o-o, Спасибо за подтверждение. В итоге вернулись к тому, с чего началась тема ))) Почему sp_executesql ведет себя не так, как, к примеру, exec ( ) at. |
28 июл 16, 10:31 [19465961] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
o-o
Guest |
объяснение найдено в документации: BY DESIGN (кто бы сомневался)
Handling Errors in Server-to-Server Remote Stored Procedures т.е. если бы ошибка была BATCH ABORTING, ее бы отловил TRY…CATCH. меняем процедуру на такую: create proc trycatch2 as select cast ('a' as int); go получаем локально черным по белому:
а пример с 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] Ответить | Цитировать Сообщить модератору |
Pavel1211 Member Откуда: Екатеринбург Сообщений: 205 |
o-o,
Уверены? У меня на 2008R2 не дошел до print. Только ошибку вываливает |
||
28 июл 16, 12:50 [19466955] Ответить | Цитировать Сообщить модератору |
o-o
Guest |
ну и сервер у вас, какой-то уникальный! ![]() вот обе ошибки в соседних окнах, конечно же 1 / 0 не обрывает бэтч в отличие от конверта К сообщению приложен файл. Размер - 58Kb |
||||
28 июл 16, 13:06 [19467088] Ответить | Цитировать Сообщить модератору |
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 | ![]() |