Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 TRY/CATCH - SEVERITY 16  [new]
Ora Starter
Member

Откуда: Киев
Сообщений: 587
Гуру, есть такой код:
begin try
	declare @id uniqueidentifier
	set @id = (select cast(1 as uniqueidentifier))
	print 'OK'
end try
begin catch
	print 'Error'
end catch
catch не ловит ошибку, хотя она и выше 10 и ниже 20.
Как быть?
Спасибо.
9 июл 09, 16:43    [7398142]     Ответить | Цитировать Сообщить модератору
 Re: TRY/CATCH - SEVERITY 16  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
Это ошибка времени компиляции, а не времени выполнения.

The following types of errors are not handled by a CATCH block when they occur at the same level of execution as the TRY…CATCH construct:

Compile errors, such as syntax errors, that prevent a batch from running.

Сообщение было отредактировано: 9 июл 09, 16:58
9 июл 09, 16:58    [7398263]     Ответить | Цитировать Сообщить модератору
 Re: TRY/CATCH - SEVERITY 16  [new]
Ora Starter
Member

Откуда: Киев
Сообщений: 587
Спасибо.
А как узнать что это ошибка времени компиляции?
Это тоже ?
[src]
use tempdb
GO
if not OBJECT_ID('t1') is null drop table t1
create table t1 (
i int
)
GO
insert into t1 values(1)
GO
begin try
select cast(i as uniqueidentifier) from t1
print 'OK'
end try
begin catch
print 'Error'
end catch
GO
9 июл 09, 17:08    [7398333]     Ответить | Цитировать Сообщить модератору
 Re: TRY/CATCH - SEVERITY 16  [new]
Glory
Member

Откуда:
Сообщений: 104760
Открыть в хелпе статью CAST and CONVERT и узнать, между какими типами разрешены явные и неявные конвертации
9 июл 09, 17:11    [7398368]     Ответить | Цитировать Сообщить модератору
 Re: TRY/CATCH - SEVERITY 16  [new]
Ora Starter
Member

Откуда: Киев
Сообщений: 587
Glory,

спасибо. Но хотелось бы разобраться почему try/catch не отрабатывает...
9 июл 09, 17:13    [7398387]     Ответить | Цитировать Сообщить модератору
 Re: TRY/CATCH - SEVERITY 16  [new]
Ora Starter
Member

Откуда: Киев
Сообщений: 587
use tempdb
GO
if not OBJECT_ID('t1') is null drop table t1
create table t1 (
	i int,
	s varchar(38)
)
GO
insert into t1 values(1, '')
GO
begin try
	select cast(s as uniqueidentifier) from t1
	print 'OK'
end try
begin catch
	print 'Error'
end catch
GO
Уровень ошибки точно такой-же, но тут ловит. Странно.
Версия mssql:
Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86)
Jul 9 2008 14:43:34
Copyright (c) 1988-2008 Microsoft Corporation
Enterprise Edition on Windows NT 5.2 <X86> (Build 3790: Service Pack 2)
9 июл 09, 17:16    [7398416]     Ответить | Цитировать Сообщить модератору
 Re: TRY/CATCH - SEVERITY 16  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31167
Ora Starter
Спасибо.
А как узнать что это ошибка времени компиляции?
Это тоже ?
Конечно. Сервер и не начинает пытаться исполнять ваш запрос. Соответственно, и оператор begin try не может увидеть.
Сравните с вашим кодом:
use tempdb
GO
if not OBJECT_ID('t1') is null drop table t1
create table t1 
(
	i int
)
GO
insert into t1 values(1)
GO

begin try
print 'start'
exec ('select cast(i as uniqueidentifier) from t1')
print 'OK'
end try
begin catch
print 'Error'
end catch

go
drop table t1 
Или попробуйте вызвать ваш код без вставки, на пустой таблице - будет то же самое.
9 июл 09, 17:18    [7398444]     Ответить | Цитировать Сообщить модератору
 Re: TRY/CATCH - SEVERITY 16  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
Ora Starter

Уровень ошибки точно такой-же, но тут ловит. Странно.


Ну что ж тут странного... Во втором случае оптимизатор не может определить тип столбца и ошибка появляется во время выполнения. В первом же случае у Вас константа, котрую оптимизатор понимает.
9 июл 09, 17:20    [7398459]     Ответить | Цитировать Сообщить модератору
 Re: TRY/CATCH - SEVERITY 16  [new]
Ora Starter
Member

Откуда: Киев
Сообщений: 587
pkarklin,

чуть не понятно, т.е. если тип столбца int, то оптимизатор это может определить , если varchar, то нет?
9 июл 09, 17:24    [7398502]     Ответить | Цитировать Сообщить модератору
 Re: TRY/CATCH - SEVERITY 16  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
нет не тип столбца в первом примере у вас переменая,во втором ето поле в таблице....
-------------------------------------
Jedem Das Seine
9 июл 09, 17:26    [7398530]     Ответить | Цитировать Сообщить модератору
 Re: TRY/CATCH - SEVERITY 16  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31167
Ora Starter
pkarklin,

чуть не понятно, т.е. если тип столбца int, то оптимизатор это может определить , если varchar, то нет?
Из int нельзя сделать uniqueidentifier, а из varchar иногда можно.
9 июл 09, 17:30    [7398553]     Ответить | Цитировать Сообщить модератору
 Re: TRY/CATCH - SEVERITY 16  [new]
Ora Starter
Member

Откуда: Киев
Сообщений: 587
Ну вот два примера:
use tempdb
GO
if not OBJECT_ID('t1') is null drop table t1
create table t1 (
	i int,
	s varchar(38)
)
GO
insert into t1 values(1, '')
GO
begin try
	select cast(i as uniqueidentifier) from t1
	print 'OK'
end try
begin catch
	print 'Error'
end catch
GO
begin try
	select cast(s as uniqueidentifier) from t1
	print 'OK'
end try
begin catch
	print 'Error'
end catch
GO
drop table t1
GO
Переменных нет. В первом случае:
Msg 529, Level 16, State 2, Line 2
Explicit conversion from data type int to uniqueidentifier is not allowed.
Во втором catch сработал. Видим:
Error
Где собака порылась? :)
9 июл 09, 17:30    [7398559]     Ответить | Цитировать Сообщить модератору
 Re: TRY/CATCH - SEVERITY 16  [new]
Glory
Member

Откуда:
Сообщений: 104760
Ora Starter
pkarklin,

чуть не понятно, т.е. если тип столбца int, то оптимизатор это может определить , если varchar, то нет?

Вы посмотрели в статье про CAST and CONVERT про конвертацию типов данных ?
Понимаете разницу между невозможностью преобразовать один тип в другой и ошибкой преобразования для конкретного значения ?
9 июл 09, 17:31    [7398574]     Ответить | Цитировать Сообщить модератору
 Re: TRY/CATCH - SEVERITY 16  [new]
Ora Starter
Member

Откуда: Киев
Сообщений: 587
Всем спасибо! Дошло.
9 июл 09, 17:32    [7398586]     Ответить | Цитировать Сообщить модератору
 Re: TRY/CATCH - SEVERITY 16  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31167
Ora Starter

Переменных нет. В первом случае:
Msg 529, Level 16, State 2, Line 2
Explicit conversion from data type int to uniqueidentifier is not allowed.
Во втором catch сработал. Видим:
Error
Где собака порылась? :)
Ну прочтите наконец ответы :-)

В первом случае есть ошибка компиляции, преобразование невозможно.
Во втором случае нет ошибки компиляции, преобразование корректное.
9 июл 09, 17:34    [7398596]     Ответить | Цитировать Сообщить модератору
 Re: TRY/CATCH - SEVERITY 16  [new]
Ora Starter
Member

Откуда: Киев
Сообщений: 587
Glory,

конечно читал. но мне не доходило что оптимизатор может быть настолько умным, что даже запрос не будет выполнять если он точно знает, что так делать нельзя...:)
9 июл 09, 17:34    [7398598]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить