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

Откуда:
Сообщений: 6204
Недавно мне для 2005-го сервера понадобилась функция перевода 16-ричных строчек в varbinary. Сделал так:
CREATE function [dbo].[uf_Hex2Bin](@hex_str varchar(18))
returns varbinary(max)
with schemabinding
as
begin
	declare @res varbinary(max);
	select @res=convert(xml,'').value('xs:hexBinary(concat(sql:column("t1.pad"),substring(sql:variable("@hex_str"), sql:column("t.pos"))))', 'varbinary(max)')
	from (select case substring(@hex_str, 1, 2) when '0x' then 3 else 0 end) as t(pos)
	cross apply (select REPLICATE('0', len(@hex_str)%2)) t1(pad)
	return @res;
end;

Работает она нормально, но есть один нюанс: если ей передать невалидную строчку, то она возвращает NULL, хотя если попробовать выполнить, например,
select convert(xml,'').value('xs:hexBinary("q")', 'varbinary(max)')

то будет выдана ошибка

Msg 9319, Level 16, State 1, Line 1
XQuery [value()]: Static simple type validation: Invalid simple type value 'q'.

Хотелось бы, чтобы и функция выдавала аналогичное, а не NULL. Выяснил, что причина - в sql:variable:
declare
	@s varchar(10);
set @s='q';
select convert(xml,'').value('xs:hexBinary(sql:variable("@s"))', 'varbinary(max)')

возвращает NULL, т.е. при использовании sql:variable исключение парсинга подавляется. Можно ли этого как-то избежать, чтобы самописная функция всегда выбрасывала исключение, если передана невалидная строчка?
28 янв 12, 07:34    [11988447]     Ответить | Цитировать Сообщить модератору
 Re: Отмена подавления исключений парсинга в XQuery  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6204
Мда... видимо, никак:
http://msdn.microsoft.com/en-us/library/ms188657.aspx#sectionToggle2
In XQuery, most dynamic errors are mapped to an empty sequence ("()"). However, these are the two exceptions: Overflow conditions in XQuery aggregator functions and XML-DML validation errors. Note that most dynamic errors are mapped to an empty sequence. Otherwise, query execution that takes advantages of the XML indexes may raise unexpected errors. Therefore, to provide an efficient execution without generating unexpected errors, SQL Server Database Engine maps dynamic errors to ().

Вариант типа
declare
	@s varchar(10);
set @s='q';
select convert(xml, @s).value('xs:hexBinary(text()[1])', 'varbinary(max)')

работает аналогично - возвращает NULL. Т.е. сообщение об ошибке будет только в случае hardcoded expression. Жаль...
28 янв 12, 09:34    [11988510]     Ответить | Цитировать Сообщить модератору
 Re: Отмена подавления исключений парсинга в XQuery  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3422
fn_varbintohexstr не подходит?
29 янв 12, 15:00    [11991545]     Ответить | Цитировать Сообщить модератору
 Re: Отмена подавления исключений парсинга в XQuery  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6204
Ennor Tiegael
fn_varbintohexstr не подходит?

У меня преобразование в обратном направлении.
29 янв 12, 17:33    [11992068]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить