Vous pouvez tirer parti d'une table numérique pour effectuer l'analyse de chaîne.
Créer une table de nombres physiques :
create table dbo.Numbers (N int primary key);
insert into dbo.Numbers
select top 1000 row_number() over(order by number) from master..spt_values
go
Créer une table de test avec 1 000 000 lignes
create table #yak (i int identity(1,1) primary key, array varchar(50))
insert into #yak(array)
select 'a,b,c' from dbo.Numbers n cross join dbo.Numbers nn
go
Créer la fonction
create function [dbo].[ufn_ParseArray]
( @Input nvarchar(4000),
@Delimiter char(1) = ',',
@BaseIdent int
)
returns table as
return
( select row_number() over (order by n asc) + (@BaseIdent - 1) [i],
substring(@Input, n, charindex(@Delimiter, @Input + @Delimiter, n) - n) s
from dbo.Numbers
where n <= convert(int, len(@Input)) and
substring(@Delimiter + @Input, n, 1) = @Delimiter
)
go
Utilisation (produit 3 millions de lignes en 40 secondes sur mon ordinateur portable)
select *
from #yak
cross apply dbo.ufn_ParseArray(array, ',', 1)
nettoyage
drop table dbo.Numbers;
drop function [dbo].[ufn_ParseArray]
Les performances ici ne sont pas étonnantes, mais appeler une fonction sur une table d'un million de lignes n'est pas la meilleure idée. Si vous effectuez une chaîne divisée sur plusieurs lignes, j'éviterais la fonction.