EXTRAITCHAINE - Extraction de sous-chaîne
Version SQL Server (code en procédure stockée)
But : Permet d'extraire une sous-chaîne d'une chaîne de caractères en fonction
d'un séparateur de chaîne donné.
Cette fonction est inspirée de la fonction ExtraitChaîne() de Windev.
Code SQL :
CREATE FUNCTION [dbo].[FNG_EXTRAITCHAINE]
(
@psCh VarChar(1000),
@pnPos Integer,
@psSep VarChar(10)
) RETURNS varchar(255)
AS
/*
Description: Permet d'extraire une sous-chaîne d'une chaîne de caractères en fonction d'un séparateur de chaîne donné. (comme ExtraitChaîne() de Windev)
Syntaxe : <Résultat> = _EXTRAITCHAINE(<Chaîne initiale>, <Rang>, <Séparateur>)
* Détails des paramètres :
<Résultat> : Chaîne de caractères correspond à :
- La sous-chaîne comprise entre le séparateur de rang <Rang> - 1 et le séparateur de rang <Rang>
- La <Chaîne initiale> en totalité si <Rang> est égal à 1.
<Chaîne initiale> : Chaîne de caractères (taille maximale 4 Go) contenant la chaîne à extraire.
<Rang> : Numéro d'ordre du séparateur.
<Séparateur> : Chaîne de caractères permettant de délimiter les sous-chaînes. (actuellement limité à 10 caractères)
Exemple : Select _EXTRAITCHAINE('www.mysql.com', 2, '.') donne mysql
Exemples de séparateur possible : ¤ ou | (les doubler si nécessaire)
*/
BEGIN
Declare @indice tinyint
Declare @sRet VarChar(1000) -- Pour la chaîne à retourner
Declare @sChN VarChar(1000) -- Pour la chaîne extraite à la postion @pnPos par FNG_Substring_Index()
Declare @sChNm1 VarChar(1000) -- Pour la chaîne extraite à la postion @pnPos-1 par FNG_Substring_Index()
Declare @nTaille Integer -- @nTaille de la chaîne à extraire
Declare @nTailleSep Integer -- @nTaille du séparateur
Declare @nPosCh Integer -- Position de la chaîne à extraire
Declare @nNbSeparators integer
Set @nNbSeparators = DBO.Occurs(@psCh, @psSep)
-- Si la position est plus grande que le nombre de séparateurs + 1
If @pnPos > @nNbSeparators + 1
Return NULL -- Renvoie NULL
Set @nTailleSep = LEN(@psSep)
IF @pnPos = 1
Set @sRet = DBO.FNG_Substring_Index(@psCh, @psSep, @pnPos)
ELSE IF @pnPos > 1
Begin
Set @sChNm1 = DBO.FNG_Substring_Index(@psCh, @psSep, @pnPos-1)
Set @sChN = DBO.FNG_Substring_Index(@psCh, @psSep, @pnPos)
Set @nTaille = LEN(@sChN) - LEN(@sChNm1) - @nTailleSep
Set @nPosCh = LEN(@sChNm1) + @nTailleSep + 1
Set @sRet = SUBSTRING(@psCh, @nPosCh, @nTaille)
End
ELSE
Set @sRet = '' -- Renvoie une chaîne vide pour les autres valeurs de Position
RETURN @sRet
END
----------------------------------------------------------
CREATE FUNCTION [dbo].[Occurs] ( @pInput VARCHAR(1000), @pSearchChar CHAR(1) )
RETURNS INT
BEGIN
RETURN (LEN(@pInput) - LEN(REPLACE(@pInput, @pSearchChar, '')))
END
----------------------------------------------------------
CREATE FUNCTION [dbo].[FNG_Substring_Index]
(
@pString varchar(255),
@pDelimiter varchar(255),
@pPos tinyint
) RETURNS varchar(255)
AS
-- Description:
-- Equivalent de MySql Substring_index()
BEGIN
Declare @nIndice tinyint
Declare @i tinyint
Declare @sResult varchar(255)
Declare @nNbSeparators integer
Set @nNbSeparators = DBO.Occurs(@pString, @pDelimiter)
-- Si le dernier paramètre est plus grand que le nombre de séparateurs+1
If @pPos >= @nNbSeparators + 1
Return @pString
-- Sinon
Set @i= 1
Set @nIndice = 0
While @nIndice < @pPos
Begin
Begin
Set @i = CHARINDEX(@pDelimiter,@pString,@i+1)
Set @nIndice = @nIndice +1
End
If @nIndice = @pPos
Begin
Set @sResult=left(@pString,@i-1)
Break
End
Else
Continue
End
RETURN @sResult
END
No comments:
Post a Comment