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

Откуда: СПб
Сообщений: 108
Параметр для табличной UDF - строка( числа, разделенные запятой). Для IN( ч1, ч2, ...) - не подходит. Подскажите, пожалуйста, как преобразовать... Или, может быть, проще формировать параметр иначе?
18 фев 12, 19:44    [12116284]     Ответить | Цитировать Сообщить модератору
 Re: Преобразовать символьную строку в числа...  [new]
aleks2
Guest
CREATE function [dbo].[f_StrToTableEx](@str varchar(8000), @delimiter varchar(64)=',')
returns table as
return(
WITH str_nums ( n1, n2, Number ) 
AS 
( 
select  1-DATALENGTH(@delimiter) as n1, charindex(@delimiter, @str+@delimiter) as n2, 0 as Number  
UNION ALL 
select n2 as n1, charindex(@delimiter, @str+@delimiter, n2+DATALENGTH(@delimiter)) as n2, Number+1 as Number
from str_nums
WHERE n2<DATALENGTH(@str)
) 
SELECT SUBSTRING(@str, n1+DATALENGTH(@delimiter), n2-n1-DATALENGTH(@delimiter)) as Value, Number, n1+DATALENGTH(@delimiter) as StartPosition FROM str_nums
)
18 фев 12, 20:07    [12116352]     Ответить | Цитировать Сообщить модератору
 Re: Преобразовать символьную строку в числа...  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
gloryk62
Подскажите, пожалуйста, как преобразовать... Или, может быть, проще формировать параметр иначе?
Вообще говоря, да.
Если версия >=10.0, то лучше использовать параметры табличного типа.
См. parameter_data_type
18 фев 12, 20:18    [12116385]     Ответить | Цитировать Сообщить модератору
 Re: Преобразовать символьную строку в числа...  [new]
qwerty112
Guest
CREATE FUNCTION dbo.haba_haba (@DATA varchar(max))
RETURNS @t TABLE ( data int )
AS
BEGIN
	declare @XML xml
	--
	set @XML = cast('<root><row data="'+replace(@DATA, ',','" /><row data="')+'" /></root>' as xml)
	--
	insert into @t (data)		
	select x.value('@data', 'int') as data
	from @XML.nodes('/root/row') r(x)	
	--
	RETURN 
END

select * from dbo.haba_haba('1,2,3,45,6,789')

data
-----------
1
2
3
45
6
789
18 фев 12, 20:21    [12116400]     Ответить | Цитировать Сообщить модератору
 Re: Преобразовать символьную строку в числа...  [new]
gloryk62
Member

Откуда: СПб
Сообщений: 108
aleks2, СПАСИБО БОЛЬШОЕ !
18 фев 12, 20:29    [12116440]     Ответить | Цитировать Сообщить модератору
 Re: Преобразовать символьную строку в числа...  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
iap
gloryk62
Подскажите, пожалуйста, как преобразовать... Или, может быть, проще формировать параметр иначе?
Вообще говоря, да.
Если версия >=10.0, то лучше использовать параметры табличного типа.
См. parameter_data_type
Собственно говроя, зачем стараться-заворачивать числа в строку,
чтобы внутри функции её тут же распарсивать обратно?
Это же глупо, не находите?
18 фев 12, 20:30    [12116443]     Ответить | Цитировать Сообщить модератору
 Re: Преобразовать символьную строку в числа...  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
gloryk62
aleks2, СПАСИБО БОЛЬШОЕ !
Раз пошла такая пьянка, то у меня тоже функция есть!
18 фев 12, 20:34    [12116455]     Ответить | Цитировать Сообщить модератору
 Re: Преобразовать символьную строку в числа...  [new]
gloryk62
Member

Откуда: СПб
Сообщений: 108
iap, согласен. параметр формирую сам( нужен для SELECT ... FROM ... WHERE имя_поля IN (числа_из_строки_через_запятую)). Можете предложить вариант более простой?
18 фев 12, 20:54    [12116509]     Ответить | Цитировать Сообщить модератору
 Re: Преобразовать символьную строку в числа...  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
gloryk62
iap, согласен. параметр формирую сам( нужен для SELECT ... FROM ... WHERE имя_поля IN (числа_из_строки_через_запятую)). Можете предложить вариант более простой?
Я ж предложил табличный параметр и JOIN с ним внутри функции (вместо пресловутого IN).
Хотя, можно и IN, и EXISTS() - если записи в табличном параметре неуникальны.
Кстати, этот параметр и индексировать можно.
Единственная проблема - его надо заполнить значениями.
Но ведь эта проблема решается как-то при формировании строки.
18 фев 12, 21:18    [12116591]     Ответить | Цитировать Сообщить модератору
 Re: Преобразовать символьную строку в числа...  [new]
gloryk62
Member

Откуда: СПб
Сообщений: 108
iap, спасибо за подсказки! Воспользовался 1-ым вариантом

ALTER FUNCTION [dbo].[udf_NewSelePropNN]
(
@pNN INTEGER,
@pWhere CHAR(255)
)
RETURNS TABLE
AS
RETURN
(
SELECT DISTINCT СвойстваЗначение.КодЗначения, СвойстваЗначение.ЗначениеСвойства
FROM СвойстваЗначение
INNER JOIN (SELECT * FROM Свойства WHERE КодСвойства = @pNN) s ON s.КодСвойства = СвойстваЗначение.КодСвойства
INNER JOIN (
SELECT n1.НомерЗаписи, n1.КодНаименования, n1.КодСвойства, n1.НомерСвойства
FROM НоменклатураПлюс n1
INNER JOIN (SELECT * FROM НоменклатураПлюс ) n2 ON n1.КодНаименования = n2.КодНаименования
WHERE n2.НомерСвойства IN ( SELECT [Value] FROM udf_StrToTableEx( @pWhere, ','))
) n ON СвойстваЗначение.КодЗначения = n.НомерСвойства
)

Если есть минута - имею проблему с 5 списками-мультиселектами с очередностью, при выборе из одного меняю данные только в следующем и снимаю пометки... Наверное, это правильно...

СПАСИБО ВСЕМ!!!
18 фев 12, 22:39    [12116856]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить