-- Tables Creation
IF OBJECT_ID('TempDB..#Test') IS NOT NULL DROP TABLE #Test
CREATE TABLE #Test (ID INT, Name VARCHAR(30))
-- Sample Data
INSERT INTO #Test(ID, Name) VALUES(1,'Test'),(2,'&Test'), (3,'')
-- Actual Data
SELECT ID, Name FROM #test
Required Output
Test,&Test,
Se eseguo questo codice:
SELECT STUFF((SELECT ','+Name AS [text()] FROM #Test FOR XML PATH('')),1,1,'')
Current Output
Test,&Test,
Solution:
SELECT STUFF((SELECT ','+Name AS [text()] FROM #Test FOR XML PATH(''), TYPE).value('.', 'VARCHAR(MAX)'),1,1,'') AS 'NameList'
L'alias [text()] pare si possa omettere:
SELECT STUFF((SELECT ','+Name FROM #Test FOR XML PATH(''), TYPE).value('.', 'VARCHAR(MAX)'),1,1,'') AS 'NameList'
Da approfondire, ma la magia è fatta dal "value() Method":
MSDN page for "value() Method (xml Data Type)"
Trovato qui.
Se dovesse dare questo errore:
Impossibile eseguire SELECT perché le impostazioni delle opzioni SET seguenti non sono corrette: 'ARITHABORT'. Verificare che tali opzioni SET siano corrette per l'utilizzo con viste indicizzate e/o indici su colonne calcolate e/o indici filtrati e/o notifiche delle query e/o metodi per tipi di dati XML e/o operazioni sugli indici spaziali.
Prima della SELECT bisogna impostare SET ARITHABORT ON:
SET ARITHABORT ON
SELECT STUFF((SELECT ','+Name AS [text()] FROM #Test FOR XML PATH(''), TYPE).value('.', 'VARCHAR(MAX)'),1,1,'') AS 'NameList'
docs.microsoft.com: set-arithabort-transact-sql