SQL: Mehrere Sätze als einzelner String zusammenfassen

Weil die neue STRING_AGG() nicht mehr als 8000 Zeichen akzeptiert, muss man sich weiterhin behelfen:

DECLARE @T TABLE (t uniqueidentifier)
Insert into @T
Select '19324C4B-83AE-E211-83C9-005056B05853'
union all 
Select '99324C4B-83AE-E211-83C9-005056B05800'

--Mehrere Sätze als einzelner String zusammenfassen:
SELECT STUFF(
 				(
				SELECT ','+CAST(t as varchar(38))
				FROM @t
				FOR XML PATH ('')
				)
			,1,1,'')

Kommaseparierte Liste – Implode (XML)

 

SELECT
	a.AccountID
	,STUFF(
		(SELECT '; ' + Coalesce(Lastname,'')+Coalesce(', '+Firstname,'')
		 FROM Contact c
		 Where c.AccountID = a.AccountID
		 FOR XML PATH('')
		)
		, 1, 2, '')
	    As concatenated_string
FROM Account a
order by a.accountid

Hinweis: Falls der Ergebnis-String nicht größer wird als 4000 bzw. 8000 Zeichen, dann könnte auch „STRING_AGG“ benutzt werden!

Kommaseparierte Liste – Implode (Funktion)

Beispiel Code um aus mehreren Sätze eine „Kommaseparierte Liste“ zu haben:


IF EXISTS (select name from sysobjects where name = 'fod_implode' and Type = 'FN') Drop function fod_implode

CREATE FUNCTION sysdba.fod_implode ( @id AS char(12))
RETURNS varchar(4000)
BEGIN
      DECLARE @implode varchar(3000)
      Set @implode = ''
      
      DECLARE Name_Cursor CURSOR FOR
      SELECT lastname FROM sysdba.Contact WHERE accountid = @id
            
      DECLARE @Value varchar(255)
      OPEN Name_Cursor
      FETCH NEXT FROM Name_Cursor into @Value

      WHILE (@@FETCH_STATUS = 0)
      BEGIN
            if @implode = ''
                  Set @implode = @Value
            else
                  Set @implode = @implode + ', ' + @Value
            FETCH NEXT FROM Name_Cursor into @Value
      END 
      CLOSE Name_Cursor
      DEALLOCATE Name_Cursor
      
    --Rueckgabewert:
   RETURN @implode
END