пятница, 3 февраля 2017 г.

t-SQL. строку в столбец.

по ходу работы потребовалось вставить строку в t-sql выражение IN. например, на входе есть такая строка: "0001,0808,6695,1234,6578" или подобное.
как следствие родилась небольшая табличная функция.
длину более 10 элементов на скорость работы не проверял.

ну и длина единичного элемента не более varchar(10). ибо в задаче длина 4.

create function dbo.fn_splitFlyingNumbersXML(@str varchar(512),@delimiter varchar(1))
RETURNS @retTbl TABLE (number varchar(4) )
as begin
DECLARE @xml as xml
set @str=replace(@str,' ','')
SET @xml = cast((''+replace(@str,@delimiter ,'')+'') as xml)
insert @retTbl
SELECT case when (len(N.value('.', 'varchar(4)'))<4 len="" p="" then="" value="" varchar=""> else N.value('.', 'varchar(4)') end as value FROM @xml.nodes('X') as T(N)
return
end
go

используется вот так: 
select * from Numbers where number in (select * from 
dbo.fn_splitFlyingNumbersXML('0001,0808,6695,1234,6578')
)

вариант с разделителем:
create function [dbo].[fn_splitStringXML](@str varchar(512),@delimiter varchar(1))
RETURNS @retTbl TABLE (number varchar(10) )
as begin
DECLARE @xml as xml
set @str=replace(@str,' ','')
SET @xml = cast((''+replace(@str,@delimiter ,'')+'') as xml)
insert @retTbl
SELECT N.value('.', 'varchar(10)') as value FROM @xml.nodes('X') as T(N)
return
end 

Комментариев нет:

Отправить комментарий