-- ================================================================ -- 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