SQL server : fonctions perso traitement de chaines de caractères
USE [GDS]
GO
/****** Object: UserDefinedFunction [dbo].[FNG_EXTRAITCHAINE] Script Date: 12/23/2013 18:32:19 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER OFF
GO
CREATE FUNCTION [dbo].[FNG_EXTRAITCHAINE]
(
@psCh VarChar(1000),
@pnPos Integer,
@psSep VarChar(10)
) RETURNS varchar(255)
AS
-- Description:
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
Set @nTailleSep = LEN(@psSep)
IF @pnPos = 1
Set @sRet = GDS.DBO.FNG_Substring_Index(@psCh, @psSep, @pnPos)
ELSE IF @pnPos > 1
Begin
Set @sChNm1 = GDS.DBO.FNG_Substring_Index(@psCh, @psSep, @pnPos-1)
Set @sChN = GDS.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
GO
==============================================================
USE [GDS]
GO
/****** Object: UserDefinedFunction [dbo].[FNG_Substring_Index] Script Date: 12/23/2013 18:34:16 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER OFF
GO
CREATE FUNCTION [dbo].[FNG_Substring_Index]
(
@BaseString varchar(255),
@caracter varchar(255),
@pos tinyint
) RETURNS varchar(255)
AS
-- Description:
-- Equivalent de MySql Substring_index()
BEGIN
Declare @indice tinyint
Declare @pos2 tinyint
Declare @result varchar(255)
Declare @nNbSeparators integer
Set @nNbSeparators = GDS.[dbo].[Occurs](@BaseString, @caracter)
-- Si le dernier paramètre est plus grand que le nombre de séparateurs
If @pos >= @nNbSeparators + 1
Return @BaseString
-- Sinon
Set @pos2= 1
Set @indice = 0
While @indice < @pos
Begin
begin
set @pos2 = CHARINDEX(@caracter,@BaseString,@pos2+1)
set @indice = @indice +1
end
if @indice = @pos
begin
set @result=left(@BaseString,@pos2-1)
break
end
else
continue
End
RETURN @result
END
GO