Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 T-SQL TRY ... CATCH и exec ... at  [new]
Иван К.
Guest
Есть такой код:
begin try
  exec('alter table tbl add constraint pk primary key (id)') at srv
end try
begin catch
  select 'Error!'
end catch

Идея в том, чтобы пакет завершался без ошибок, то есть в случае возникновения ошибки срабатывал catch и всё.
Однако, команда 'alter table tbl add constraint pk primary key (id)' в том случае, если поле id имеет свойство null, генерирует два отдельных сообщения об ошибке. При этом одно сообщение проскакивает мимо обработчика try ... catch и пакет завершается с признаком ошибки. Причём, если exec локальный, то такой проблемы не возникает. То есть складывается впечатление, что некорректно реализована обработка ошибок при выполнении удалённых запросов.
Вопрос: можно ли это как-то преодолеть? MS SQL Server 2005.
30 сен 15, 16:46    [18215964]     Ответить | Цитировать Сообщить модератору
 Re: T-SQL TRY ... CATCH и exec ... at  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8815
Иван К.,

в справке написано, что ловит и что не ловит try ... catch.
30 сен 15, 18:17    [18216659]     Ответить | Цитировать Сообщить модератору
 Re: T-SQL TRY ... CATCH и exec ... at  [new]
Иван К.
Guest
Владислав Колосов,

Это ошибка реализации SQL-сервера. Такая же команда в exec(...) без at с ошибкой нормально обрабатывается TRY ... CATCH. Поглощаются оба сообщения об ошибке. А в случае с at только одно. А второе вываливается.
1 окт 15, 08:50    [18218155]     Ответить | Цитировать Сообщить модератору
 Re: T-SQL TRY ... CATCH и exec ... at  [new]
Glory
Member

Откуда:
Сообщений: 104751
Иван К.
Это ошибка реализации SQL-сервера.

Вообще то exec() at srv всего лишь передает текст команды линкованному серверу
1 окт 15, 08:54    [18218170]     Ответить | Цитировать Сообщить модератору
 Re: T-SQL TRY ... CATCH и exec ... at  [new]
aleks2
Guest
begin try
  exec('begin try alter table tbl add constraint pk primary key (id) begin catch end catch') at srv
end try
begin catch
  select 'Error!'
end catch
1 окт 15, 09:03    [18218200]     Ответить | Цитировать Сообщить модератору
 Re: T-SQL TRY ... CATCH и exec ... at  [new]
Иван К.
Guest
Glory
Иван К.
Это ошибка реализации SQL-сервера.

Вообще то exec() at srv всего лишь передает текст команды линкованному серверу

И обрабатывает то, что она возвращает. Обрабатывает некорректно.
1 окт 15, 10:48    [18218823]     Ответить | Цитировать Сообщить модератору
 Re: T-SQL TRY ... CATCH и exec ... at  [new]
Иван К.
Guest
aleks2,

Да, такая идея тоже была. Но проблема в том что линкованый сервер: MS SQL Server 2000. В котором нет TRY ... CATCH.
1 окт 15, 10:51    [18218849]     Ответить | Цитировать Сообщить модератору
 Re: T-SQL TRY ... CATCH и exec ... at  [new]
Glory
Member

Откуда:
Сообщений: 104751
Иван К.
Glory
пропущено...

Вообще то exec() at srv всего лишь передает текст команды линкованному серверу

И обрабатывает то, что она возвращает. Обрабатывает некорректно.

Ну конечно. Вот вы бы легко обработали, то что произошло на удаленном сервере.
1 окт 15, 10:52    [18218860]     Ответить | Цитировать Сообщить модератору
 Re: T-SQL TRY ... CATCH и exec ... at  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8815
Иван К.,

на самом деле манипуляции со схемой должно выполнять приложение, а не сервер баз данных. Вы пытаетесь "проскочить" на возможности... По-моему это неверно.
1 окт 15, 11:40    [18219315]     Ответить | Цитировать Сообщить модератору
 Re: T-SQL TRY ... CATCH и exec ... at  [new]
ziktuw
Member

Откуда:
Сообщений: 3552
Иван К.,

Можно двинутся вот таким путем https://www.sql.ru/articles/mssql/2005/101908definitionofinaccessibilitylinkedserver.shtml
1 окт 15, 12:03    [18219517]     Ответить | Цитировать Сообщить модератору
 Re: T-SQL TRY ... CATCH и exec ... at  [new]
Иван К.
Guest
Владислав Колосов
Иван К.,

на самом деле манипуляции со схемой должно выполнять приложение, а не сервер баз данных. ...


Не понял. Схему всегда меняет сервер при выполнении T-SQL. Так о чём речь?
1 окт 15, 12:49    [18219899]     Ответить | Цитировать Сообщить модератору
 Re: T-SQL TRY ... CATCH и exec ... at  [new]
Иван К.
Guest
ziktuw
Иван К.,

Можно двинутся вот таким путем https://www.sql.ru/articles/mssql/2005/101908definitionofinaccessibilitylinkedserver.shtml


Так у меня пакет и не прерывается. Ошибка то всё равно вывалится.
1 окт 15, 12:56    [18219972]     Ответить | Цитировать Сообщить модератору
 Re: T-SQL TRY ... CATCH и exec ... at  [new]
Владислав Колосов
Member

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

на самом деле манипуляции со схемой должно выполнять приложение, а не сервер баз данных. ...


Не понял. Схему всегда меняет сервер при выполнении T-SQL. Так о чём речь?

С моей точки зрения сервер не должен заниматься выполнением патч-кода модификации серверных объектов, этим должно заниматься внешние приложение, оно же обрабатывать ошибки, вести протокол и т.п. Существующая практика создания таблиц при выполнении процедур, добавление-удаления колонок имеет дурной "запах" в терминах программного кода.
1 окт 15, 13:10    [18220127]     Ответить | Цитировать Сообщить модератору
 Re: T-SQL TRY ... CATCH и exec ... at  [new]
Иван К.
Guest
Владислав Колосов
Иван К.
пропущено...


Не понял. Схему всегда меняет сервер при выполнении T-SQL. Так о чём речь?

С моей точки зрения сервер не должен заниматься выполнением патч-кода модификации серверных объектов, этим должно заниматься внешние приложение, оно же обрабатывать ошибки, вести протокол и т.п. Существующая практика создания таблиц при выполнении процедур, добавление-удаления колонок имеет дурной "запах" в терминах программного кода.


Не выполнять DDL команды в пакете с другими командами что ли? Выполнять их по одной за раз из приложения? Или что?
1 окт 15, 14:40    [18220921]     Ответить | Цитировать Сообщить модератору
 Re: T-SQL TRY ... CATCH и exec ... at  [new]
Glory
Member

Откуда:
Сообщений: 104751
Иван К.
Не выполнять DDL команды в пакете с другими командами что ли?

Не использовать один MSSQL как клиентское приложение для работы с другим MSSQL
1 окт 15, 14:43    [18220952]     Ответить | Цитировать Сообщить модератору
 Re: T-SQL TRY ... CATCH и exec ... at  [new]
Иван К.
Guest
Glory
Иван К.
Не выполнять DDL команды в пакете с другими командами что ли?

Не использовать один MSSQL как клиентское приложение для работы с другим MSSQL

А почему? :)
2 окт 15, 10:28    [18224777]     Ответить | Цитировать Сообщить модератору
 Re: T-SQL TRY ... CATCH и exec ... at  [new]
Glory
Member

Откуда:
Сообщений: 104751
Иван К.
Glory
пропущено...

Не использовать один MSSQL как клиентское приложение для работы с другим MSSQL

А почему? :)

Потому что получится плохо
2 окт 15, 12:58    [18225895]     Ответить | Цитировать Сообщить модератору
 Re: T-SQL TRY ... CATCH и exec ... at  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8815
Иван К.
Glory
пропущено...

Не использовать один MSSQL как клиентское приложение для работы с другим MSSQL

А почему? :)


В ухе отверткой тоже можно ковырять. Отложите троллинг и подумайте о предназначении сервера баз данных.
2 окт 15, 13:15    [18226031]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить