Split di una stringa in una tabella in T-SQL
La seguente query T-SQL fa lo split di una stringa e la carica in una variabile tabella.
Nell'esempio viene ritornata una tabella (@tbl) partendo da una stringa (@inputString) di più Guid separati dalla virgola (@separator).
il risultato è questo:
Il tutto può essere trasformato in una funzione T-SQL dbo.SplitToTableGuid:
da usare:
Dalla versione 130 di SQL Server (2016) è disponibile la funzione STRING_SPLIT che fa esattamente la stessa cosa:
Vedi anche Funzione T-SQL per concatenare il risultato di una select in una stringa
Nell'esempio viene ritornata una tabella (@tbl) partendo da una stringa (@inputString) di più Guid separati dalla virgola (@separator).
SQL
DECLARE @inputString varchar(8000)
SET @inputString = ' 62895988-7A7C-4A2F-ACC5-E73AA0E8FF6B , ,EB0C27AA-BAF5-4FF6-BFB6-0245A2726745, F4A421BF-F5B3-4F3A-A14D-1BF0014C42D9 '
/* separo la stringa */
DECLARE @separator char(1)
SET @separator = ','
DECLARE @tosplit varchar(8000)
SET @tosplit = @inputString + @separator -- mi assicuro di avere un terminatore
DECLARE @tbl TABLE (
[ID] uniqueidentifier
)
DECLARE @p int
DECLARE @pv int
DECLARE @str varchar(1000)
SET @pv = 1
SET @p = CHARINDEX(@separator, @tosplit, @pv)
WHILE (@p > 0)
BEGIN
SET @str = ltrim(rtrim(Substring(@tosplit, @pv, @p - @pv)))
IF @str != ''
INSERT INTO @tbl VALUES(@str)
SET @pv = @p + 1
SET @p = CHARINDEX(@separator, @tosplit, @pv)
END
/* visualizza i risultati */
SELECT * FROM @tbl
ID 62895988-7A7C-4A2F-ACC5-E73AA0E8FF6B EB0C27AA-BAF5-4FF6-BFB6-0245A2726745 F4A421BF-F5B3-4F3A-A14D-1BF0014C42D9
Il tutto può essere trasformato in una funzione T-SQL dbo.SplitToTableGuid:
SQL
CREATE FUNCTION [dbo].[SplitToTableGuid](@input AS nvarchar(max), @separator char(1)=',')
RETURNS
@Result TABLE(Value uniqueidentifier)
AS
BEGIN
DECLARE @tosplit varchar(max)
SET @tosplit = @input + @separator -- mi assicuro di avere un terminatore
DECLARE @p int
DECLARE @pv int
DECLARE @str varchar(max)
SET @pv = 1
SET @p = CHARINDEX(@separator, @tosplit, @pv)
WHILE (@p > 0)
BEGIN
SET @str = ltrim(rtrim(Substring(@tosplit, @pv, @p - @pv)))
IF @str != ''
INSERT INTO @Result VALUES(@str)
SET @pv = @p + 1
SET @p = CHARINDEX(@separator, @tosplit, @pv)
END
RETURN
END
SQL
SELECT [Value]
FROM [dbo].[SplitToTableGuid](@inputString, DEFAULT)
Ad una function vanno sempre passati tutti i parametri, anche se questi hanno un valore di default. Se si vuole usare il valore di default, va esplicitamente dichiarato con la keyword DEFAULT
Dalla versione 130 di SQL Server (2016) è disponibile la funzione STRING_SPLIT che fa esattamente la stessa cosa:
SQL
SET @inputString = ' 62895988-7A7C-4A2F-ACC5-E73AA0E8FF6B , ,EB0C27AA-BAF5-4FF6-BFB6-0245A2726745, F4A421BF-F5B3-4F3A-A14D-1BF0014C42D9 '
DECLARE @separator char(1) = ',';
SELECT value
FROM STRING_SPLIT(inputString , @separator)
WHERE RTRIM(value) <> '';
Vedi anche Funzione T-SQL per concatenare il risultato di una select in una stringa