Files
2014-07-18 16:58:50 +02:00

64 lines
2.0 KiB
Transact-SQL

-- ================================================================
-- Author : Steamware
-- Create date: 2014-01-17
--
-- Description: Data una stringa con una serie di valori separati da un separatore ( es. ; )
-- ritorna l'elemento nella posizione richiesta
--
-- esempio : SELECT dbo.f_GetSubstring('asda-fff-bbb','-' , 2)
-- ================================================================
CREATE FUNCTION [dbo].[f_getSubstring]
(
@str_in NVARCHAR(4000), @separator NVARCHAR(4)= '-', @PosizValue INT = 1
)
RETURNS NVARCHAR(4000)
AS
BEGIN
DECLARE @Occurrences INT,
@Counter INT,
@tmpStr NVARCHAR(4000),
@str_out NVARCHAR(4000)
IF RIGHT(@str_in, DATALENGTH(@separator)/2 ) <> @separator
SET @str_out = @str_in + @separator ;
ELSE
SET @str_out = @str_in ;
-- calcolo il numero di elementi della nella stringa
SET @Occurrences = ( (DATALENGTH( REPLACE(@str_out, @separator, @separator+'#')) - DATALENGTH(@str_out)) ) / 2
-- se l'elemento richiesto esiste proseguo altrimenti ritorno NULL
IF @Occurrences >= @PosizValue AND @PosizValue <> 0
BEGIN
SET @tmpStr = @str_out ;
SET @Counter = 1 ;
WHILE @Counter <= @PosizValue
BEGIN
SET @Counter = @Counter + 1 ;
SET @str_out = SUBSTRING( @tmpStr, 1, CHARINDEX(@separator,@tmpStr) - 1) ;
-- metto via il resto della stringa
SET @tmpStr = SUBSTRING( @tmpStr, CHARINDEX(@separator,@tmpStr) + DATALENGTH(@separator)/2, 4000) ;
IF DATALENGTH(@tmpStr) = 0
BREAK
END
-- pulisco da caratteri NON voluti
--SET @str_out = REPLACE(@str_out, char(13), '') ; -- carriage return
--SET @str_out = REPLACE(@str_out, char(10), '') ; -- line feed
--SET @str_out = REPLACE(@str_out, char(9), '') ; -- tab
--SET @str_out = LTRIM ( RTRIM (@str_out) ) ; -- blank
END
ELSE
SET @str_out = NULL ;
RETURN @str_out
END