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

Откуда:
Сообщений: 47
Добрый день!

Имеем: работоспособное подключение от MSSQL к MySQL через Linked Server и ODBC.
При выполнении запроса иногда возникают ошибки на стороне MySQL. Пытаюсь получить текст ошибки:
    Begin Try
      exec('EXECUTE (''Drop temporary table if exists t'') At ' + @aLinkedServer); 
    End Try Begin Catch 
      Set @LogMsg = error_message();
    ...

Проблема: при любых ошибках MySQL в @LogMsg я имею только одно сообщение: Could not execute statement on remote server 'LinkedServer'.

Вопрос: как мне вытащить в @LogMsg текст ошибки, который возвращает ODBC?

Дайте направление - куда копать, пожалуйста.
19 апр 17, 21:57    [20416641]     Ответить | Цитировать Сообщить модератору
 Re: Как получить сообщение об ошибке от ODBC?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37155
Сервер уже почти 20 лет не умеет ловить ничего, кроме первой ошибки.
20 апр 17, 01:48    [20416968]     Ответить | Цитировать Сообщить модератору
 Re: Как получить сообщение об ошибке от ODBC?  [new]
NordRus
Member

Откуда:
Сообщений: 47
Как-то очень категорично.
TOAD же выводит мне в окне Messages сообщение ODBC, и следующей строкой ошибку MSSQL.
Значит, технически возможно получить сообщение ODBC. Только надо найти способ.
Что-то я пока не нашёл. Плохо ищу?
20 апр 17, 09:06    [20417270]     Ответить | Цитировать Сообщить модератору
 Re: Как получить сообщение об ошибке от ODBC?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31783
NordRus
Значит, технически возможно получить сообщение ODBC.
Технически возможно, но программисты MSSQL эту возможность не реализовали.
Это же их обработчик ловит ошибки при работе с линкед-сервером.
20 апр 17, 13:31    [20418596]     Ответить | Цитировать Сообщить модератору
 Re: Как получить сообщение об ошибке от ODBC?  [new]
NordRus
Member

Откуда:
Сообщений: 47
ОК, только TOAD - не детище Microsoft, и то, что программисты Quest смогли организовать получение от MSSQL в свой интерфейс сообщения ODBC после ошибки означает, что задача решаема.
20 апр 17, 14:04    [20418762]     Ответить | Цитировать Сообщить модератору
 Re: Как получить сообщение об ошибке от ODBC?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37155
NordRus
ОК, только TOAD - не детище Microsoft, и то, что программисты Quest смогли организовать получение от MSSQL в свой интерфейс сообщения ODBC после ошибки означает, что задача решаема.
Вот напишите свой SQL сервер и решите там эту задачу. А Microsoft по каким-то причинам не захотела или не смогла это сделать.
20 апр 17, 14:09    [20418793]     Ответить | Цитировать Сообщить модератору
 Re: Как получить сообщение об ошибке от ODBC?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31783
NordRus
что задача решаема.
я и написал - решаема. Просто в коде на T-SQL, выполняемом на стороне MSSQL, вы её не решите.

Или при выполнении именно этого кода в TOAD в переменную @LogMsg записываются оба сообщения об ошибке?
20 апр 17, 15:22    [20419175]     Ответить | Цитировать Сообщить модератору
 Re: Как получить сообщение об ошибке от ODBC?  [new]
Noskov
Member

Откуда: Москва
Сообщений: 394
Если эту ошибку сгенерировал именно MySQL, а не ODBC - её текст можно вытащить выполнив:
exec('show warnings') at LinkedMySQL
или
exec('show errors') at LinkedMySQL
20 апр 17, 16:01    [20419393]     Ответить | Цитировать Сообщить модератору
 Re: Как получить сообщение об ошибке от ODBC?  [new]
NordRus
Member

Откуда:
Сообщений: 47
Noskov, работает, спасибо! Возвращает ошибку ODBC.

Однако ещё вопрос до кучи: как мне грамотно обработать возвращаемый результат?
Функция возвращает набор из трёх полей. Чтобы использовать их, я пытаюсь поместить результат во временную таблицу:

...
End Try Begin Catch
  Declare @t Table(l binary(100), c numeric(10, 0), m binary(1000));
  Insert Into @t Execute ('show errors') at MySQL;
End Catch;

Получаю ошибку:

Error:20.04.2017 21:12:18 0:00:00.758: Lookup Error - SQL Server Database Error: The operation could not be performed because OLE DB provider "MSDASQL" for linked server "MySQL" was unable to begin a distributed transaction.
20 апр 17, 21:17    [20420274]     Ответить | Цитировать Сообщить модератору
 Re: Как получить сообщение об ошибке от ODBC?  [new]
NordRus
Member

Откуда:
Сообщений: 47
Отвечу сам себе: решение найдено. Вот оно:
End Try Begin Catch
  Declare @t Table(l binary(100), c numeric(10, 0), m binary(1000));
  Select @SQL = 'Select * From openquery(LinkedMySQL, ''show errors'')';
  Insert Into @t Exec(@sql);
  Select Convert(varchar(1000), m) From @t;
End Catch;
Возвращает ошибку ODBC.
20 апр 17, 21:41    [20420334]     Ответить | Цитировать Сообщить модератору
 Re: Как получить сообщение об ошибке от ODBC?  [new]
NordRus
Member

Откуда:
Сообщений: 47
Или проще:
End Try Begin Catch
     Declare @t Table(l Varchar(20), c int, m varchar(500));
     Insert Into @t Exec('Select * From openquery(' + @aLinkedServer + ', ''show errors'')');
     Select l,c,m From @t;
End Catch;
20 апр 17, 22:14    [20420416]     Ответить | Цитировать Сообщить модератору
 Re: Как получить сообщение об ошибке от ODBC?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37155
NordRus
Отвечу сам себе: решение найдено. Вот оно:
Возвращает ошибку ODBC.
Вам просто свезло: MySQL хранит стек своих ошибок и может их по запросу выдать.
21 апр 17, 02:01    [20420661]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить