lundi 2 mars 2009

Fonction T-SQL pour scinder une chaîne de caractères en table

La fonction suivante (pour Microsoft SQL Server) permet de découper une chaîne de caractères selon un délimiteur quelconque (qui peut être passé en argument) et retourne une table contenant une ligne pour chacune des valeurs scindées.

Cela permet donc, par exemple, de prendre un paramètre dans une procédure stockée de type "varchar(MAX)" comportant une chaîne de caractères avec des valeurs séparées par une virgule, et de découper chacune de ces valeurs pour les utiliser dans une liste "IN ( )" d'une clause "WHERE".

Voici le code de la fonction :
CREATE FUNCTION Split
(
@Delimiter varchar(5),
@List varchar(MAX)
)
RETURNS @TableOfValues table
(
RowID int IDENTITY(1,1),
[Value] varchar(MAX)
)
AS
BEGIN
DECLARE @LenString int

SET @List = LTRIM(RTRIM(@List))

WHILE LEN(@List) > 0
BEGIN
SELECT @LenString =
(CASE CHARINDEX(@Delimiter, @List)
WHEN 0 THEN LEN(@List)
ELSE (CHARINDEX(@Delimiter, @List) - 1)
END)

INSERT INTO @TableOfValues
SELECT SUBSTRING(@List, 1, @LenString)

SELECT @List =
(CASE (LEN(@List) - @LenString)
WHEN 0 THEN ''
ELSE RIGHT(@List, LEN(@List) - @LenString - 1)
END)
END
RETURN
END
Voici maintenant le code d'un exemple d'utilisation de cette fonction :
DECLARE @Table table
(
TableID int
)

INSERT INTO @Table VALUES ('12'),('34'),('56'),('78'),('90')

DECLARE @List varchar(MAX)
SET @List = '12,34,56,78,90'

SELECT * FROM @Table
WHERE TableID IN (SELECT CAST(Value AS int) FROM Split(',', @List))

Aucun commentaire:

Enregistrer un commentaire