64 lines
2.0 KiB
Transact-SQL
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
|
|
|
|
|
|
|