﻿



-- ================================================================
-- Author     : Steamware
-- Create date: 2017-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



