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;