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).

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
il risultato è questo:
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
da usare:

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
Tags:
Database75 SQL90 SQL Server100 SQL Server 201610 T-SQL66
Potrebbe interessarti anche: