(
@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