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

Откуда: СПб
Сообщений: 324
Привет всем.
Есть такая функция (нужен урезанный аналог decode из Oracle):
createfunction [dbo].[cmp](@p_oper1 sql_variant,                                       
	                        @p_oper2 sql_variant,
                            @p_return_matched sql_variant,
                            @p_return_notmatched sql_variant) 
returns sql_variant
begin	
	declare @l_res sql_variant;
	if isnull(convert(nvarchar(max), @p_oper1), 'X') = isnull(convert(nvarchar(max), @p_oper2), 'X')
		set @l_res = @p_return_matched
	else 
		set @l_res = @p_return_notmatched;
	return @l_res;  
end;
Т.е. если @p_oper1 = @p_oper2, то возвращаю @p_return_matched, иначе @p_return_notmatched.
Отдаю в функцию параметры с разными регистрами и смотрю на результат:
select [dbo].[cmp]('QQQ', 'qqq', null, 'QQQ') 
---------------------
NULL

Не могу понять, почему регистр не учитывается...
30 май 11, 14:25    [10731873]     Ответить | Цитировать Сообщить модератору
 Re: sql_variant не учитывается регистр  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

а чем стандартная case не устраивает?

Posted via ActualForum NNTP Server 1.4

30 май 11, 14:27    [10731897]     Ответить | Цитировать Сообщить модератору
 Re: sql_variant не учитывается регистр  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

не, ну если тупо по сабжу - коллейшен у сервера регистронезависимый, вот и не учитывается.
но что-то вы странное, право, придумали.

Posted via ActualForum NNTP Server 1.4

30 май 11, 14:30    [10731922]     Ответить | Цитировать Сообщить модератору
 Re: sql_variant не учитывается регистр  [new]
Гришков Максим
Member

Откуда: СПб
Сообщений: 324
daw,

Ага, спасибо!!!
Можно было бы и case'ом обойтись, просто такое сравнение нужно во многих местах. Вот, чтобы было короче и единообразнее, пришлось сделать функцию.
30 май 11, 14:32    [10731944]     Ответить | Цитировать Сообщить модератору
 Re: sql_variant не учитывается регистр  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

угу.

> Вот, чтобы было короче и единообразнее как я привык в оракле, пришлось сделать функцию.

не связывайтесь без нужды со скалярными пользовательскими функциями - это не бесплатно.

Posted via ActualForum NNTP Server 1.4

30 май 11, 14:38    [10731997]     Ответить | Цитировать Сообщить модератору
 Re: sql_variant не учитывается регистр  [new]
Гришков Максим
Member

Откуда: СПб
Сообщений: 324
daw
это не бесплатно

Вы про производительность? По-моему, в некоторых случаях, для обеспечения более удобной поддержке кода, лучше заплатить чуть-чуть производительностью, чем менять условия в 1000 местах.
Ну а про привычку, да, вы абсолютно правы .
30 май 11, 14:42    [10732036]     Ответить | Цитировать Сообщить модератору
 Re: sql_variant не учитывается регистр  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Гришков Максим
лучше заплатить чуть-чуть производительностью
Если бы чуть чуть. Может и в разы.
Легче считать Scalar Function - Deprecated. И ждать Inline.

Гришков Максим
convert(nvarchar(max), @SQL_Variant)
Ну мучайте себе и серверу голову. Пишите NVarChar(4000) или VarChar(8000).
Посмотрите на обратное:
Msg 529, Level 16, State 2, Line 4
Явное преобразование типа данных nvarchar(max) в sql_variant не разрешено.

Зачем было лишний раз конвертировать туда сюда?
А если значение параметров было 'X' и NULL?

Говнокод в топку. Пяйсателей через IF туда же. ;)

Для понимания:
DECLARE	 @SQL_Variant	Sql_Variant	= N'R' COLLATE Cyrillic_General_CI_AS
	,@SQL_Variant1	Sql_Variant	= N'r' COLLATE Cyrillic_General_CS_AS
	,@SQL_Variant2	Sql_Variant	= N'r' COLLATE Cyrillic_General_CI_AS

SELECT	CASE	WHEN @SQL_Variant = @SQL_Variant1	THEN 'Equal1'
		WHEN @SQL_Variant = @SQL_Variant2	THEN 'Equal2'
		ELSE 'Not Equal'
		END
PS: Не занимайтесь ерундой. Ну хотя бы не в рабочее время.
30 май 11, 16:39    [10733328]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить