Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Можно перехватить ошибку в динамическом sql?  [new]
kk@comson.ru
Member

Откуда: Москва
Сообщений: 81
В процедуре выполняется динамическая инструкция, содержащая ошибку:

CREATE PROCEDURE Test
AS

exec sp_executesql N'SELECT CAST(''Тра-та-та'' AS real) AS ErrorValue'
PRINT CAST(@@ERROR AS nvarchar) -- Эта инструкция уже не выполняется

GO

Мне надо перехватить ошибку и продолжить выполнение процедуры. Подскажите че-нить.
14 июл 05, 12:33    [1703533]     Ответить | Цитировать Сообщить модератору
 Re: Можно перехватить ошибку в динамическом sql?  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
А может там идет ошибка, которая валит батч.
14 июл 05, 12:35    [1703543]     Ответить | Цитировать Сообщить модератору
 Re: Можно перехватить ошибку в динамическом sql?  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
А вообще, sp_executesql умеет работать с выходными параметрами (описано в FAQ).
14 июл 05, 12:36    [1703551]     Ответить | Цитировать Сообщить модератору
 Re: Можно перехватить ошибку в динамическом sql?  [new]
kk@comson.ru
Member

Откуда: Москва
Сообщений: 81
tpg
А вообще, sp_executesql умеет работать с выходными параметрами (описано в FAQ).


А что толку-то? Ошибка может возникать и во время компиляции динамической инструкции (инвалид колумн нэйм и т. п.). Вопрос в том, существует ли механизм отлова ошибок при выполнении динамических инструкций?
14 июл 05, 12:46    [1703600]     Ответить | Цитировать Сообщить модератору
 Re: Можно перехватить ошибку в динамическом sql?  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
kk@comson.ru
А что толку-то? Ошибка может возникать и во время компиляции динамической инструкции (инвалид колумн нэйм и т. п.).
Вот именно это я и имел в виду в https://www.sql.ru/forum/actualthread.aspx?tid=200144#1703543
14 июл 05, 12:51    [1703628]     Ответить | Цитировать Сообщить модератору
 Re: Можно перехватить ошибку в динамическом sql?  [new]
kk@comson.ru
Member

Откуда: Москва
Сообщений: 81
tpg
А может там идет ошибка, которая валит батч.


Это не проблема, можно сделать батч весьма коротким:
EXEC @strSQL
14 июл 05, 12:54    [1703652]     Ответить | Цитировать Сообщить модератору
 Re: Можно перехватить ошибку в динамическом sql?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37101
kk@comson.ru
tpg
А может там идет ошибка, которая валит батч.


Это не проблема, можно сделать батч весьма коротким:
EXEC @strSQL

Чего-то не вижу взаимосвязи между длиной батча и наличием в нем ошибок, которые могут его завалить.
14 июл 05, 12:57    [1703670]     Ответить | Цитировать Сообщить модератору
 Re: Можно перехватить ошибку в динамическом sql?  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Ошибки, которые валят батч можно обработать только на клиенте. Ну, по крайней мере, это справедливо для MSSQL2000. Как там сделано на 2005 ещё надо смотреть.
14 июл 05, 12:57    [1703671]     Ответить | Цитировать Сообщить модератору
 Re: Можно перехватить ошибку в динамическом sql?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37101
tpg
Ошибки, которые валят батч можно обработать только на клиенте. Ну, по крайней мере, это справедливо для MSSQL2000. Как там сделано на 2005 ещё надо смотреть.

В любом случае, будут ошибки, которые можно обработать только на клиенте. Например те - которые валят коннект или сервер. Другое дело, что 2005 их поменее будет, одна 208 чего только стоит ...
14 июл 05, 12:59    [1703680]     Ответить | Цитировать Сообщить модератору
 Re: Можно перехватить ошибку в динамическом sql?  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Гавриленко Сергей Алексеевич
tpg
Ошибки, которые валят батч можно обработать только на клиенте. Ну, по крайней мере, это справедливо для MSSQL2000. Как там сделано на 2005 ещё надо смотреть.

В любом случае, будут ошибки, которые можно обработать только на клиенте. Например те - которые валят коннект или сервер. Другое дело, что 2005 их поменее будет, одна 208 чего только стоит ...
А 207 тоже валит в 2005?
14 июл 05, 13:01    [1703691]     Ответить | Цитировать Сообщить модератору
 Re: Можно перехватить ошибку в динамическом sql?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37101
tpg
Гавриленко Сергей Алексеевич
tpg
Ошибки, которые валят батч можно обработать только на клиенте. Ну, по крайней мере, это справедливо для MSSQL2000. Как там сделано на 2005 ещё надо смотреть.

В любом случае, будут ошибки, которые можно обработать только на клиенте. Например те - которые валят коннект или сервер. Другое дело, что 2005 их поменее будет, одна 208 чего только стоит ...
А 207 тоже валит в 2005?

Все оказалось грустно. Воз и ныне там.
begin tran
exec('
print 1
create table xxx (a int, b int)
print 2
drop table xxx
--alter table xxx drop column a
print 3
begin try
	select a from xxx
end try
begin catch
	print 4
end catch
print 5
')
print @@error
rollback
go
select @@trancount
go
if @@trancount > 0 rollback
---
1
2
3
Msg 208, Level 16, State 1, Line 9
Invalid object name 'xxx'.
208
:(
14 июл 05, 13:26    [1703850]     Ответить | Цитировать Сообщить модератору
 Re: Можно перехватить ошибку в динамическом sql?  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Ну, в принципе, не сильно то и обещали :(
14 июл 05, 13:28    [1703862]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить