Análise de campos delimitados / serializados no SQL Server

Recentemente, tive que lidar com um campo serializado no SQL Server. Minha primeira vez foi simplesmente usar uma expressão regular para extrair o penúltimo valor do campo, mas, infelizmente, o SQL Server não oferece suporte a feitiçaria.

Na verdade, parece que a capacidade de manipulação de string do SQL Server está faltando em geral.

Deixando de lado minhas queixas sobre a falta de previsão da Microsoft, aqui está a função que criei para resolver o problema:

create function [dbo].[fnGetDelimitedValue] (
@string_to_search varchar(500),
@delimiter varchar(500) = ',',
@position int = 1
)
returns varchar
(500)
begin

declare
@index int = 0;

while @index < @position -1
begin
set @string_to_search = substring(@string_to_search, charindex(@delimiter, @string_to_search)+1, LEN(@string_to_search));
set @index = @index + 1;
end

set @string_to_search = substring(@string_to_search, 1, charindex(@delimiter, @string_to_search)-1)

return @string_to_search

end

E aqui está um caso de teste simples que montei para mostrar ao resto da minha equipe como a função poderia ser usada:

create table #temp (
csv_field varchar
(100)
);

insert
into
#temp
values

('a,b,c,d,e,f,g,h,i'),
('one,two,three,four,five,six,seven,eight,nine'),
('1,2,3,4,5,6,7,8,9'),
('alpha,bravo,charlie,delta,echo,
foxtrot,golf,hotel,indigo'
);

select
dbo
.fnGetDelimitedValue(csv_field, ',', 1) first_value
, dbo.fnGetDelimitedValue(csv_field,',',5) fifth_value
, csv_field
from
#temp;

drop table
#temp;