Tout d'abord, créez une fonction (à l'aide de la CTE, expression de table commune élimine le besoin pour une table temp)
create function dbo.SplitString
(
@str nvarchar(4000),
@separator char(1)
)
returns table
AS
return (
with tokens(p, a, b) AS (
select
1,
1,
charindex(@separator, @str)
union all
select
p + 1,
b + 1,
charindex(@separator, @str, b + 1)
from tokens
where b > 0
)
select
p-1 zeroBasedOccurance,
substring(
@str,
a,
case when b > 0 then b-a ELSE 4000 end)
AS s
from tokens
)
GO
Puis, l'utiliser comme une table (ou de le modifier pour l'adapter à l'intérieur de votre procédure stockée).
select s
from dbo.SplitString('Hello John Smith', ' ')
where zeroBasedOccurance=1
Mise à jour
Version précédente serait un échec pour la chaîne d'entrée de plus de 4000 caractères. Cette version prend soin de la limitation:
create function dbo.SplitString
(
@str nvarchar(max),
@separator char(1)
)
returns table
AS
return (
with tokens(p, a, b) AS (
select
cast(1 as bigint),
cast(1 as bigint),
charindex(@separator, @str)
union all
select
p + 1,
b + 1,
charindex(@separator, @str, b + 1)
from tokens
where b > 0
)
select
p-1 ItemIndex,
substring(
@str,
a,
case when b > 0 then b-a ELSE LEN(@str) end)
AS Item
from tokens
);
GO
L'utilisation reste la même.