select ET1.EntryID,
(
select ', '+T.Name
from Tags as T
inner join EntryTag as ET2
on T.TagID = ET2.TagID
where ET1.EntryID = ET2.EntryID
for xml path(''), type
).value('substring(text()[1], 3)', 'varchar(max)') as TagsCommaDelimited
from EntryTag as ET1
group by ET1.EntryID
Rozbor dotazu
Hlavní dotaz provede group by takže pro každé EntryID získáte pouze jeden řádek .
Sloupec TagsCommaDelimited je vytvořen s korelovaným poddotazem.
V SQL Server for xml path
se používá k vytvoření XML reprezentace výsledku dotazu. Máte dobrou kontrolu nad tím, jak je XML vytvořeno pomocí aliasů sloupců a parametrů path a root .
Zřetězená hodnota ', '+T.Name v souvisejícím poddotazu nebude mít název sloupce a prázdný parametr na for xml path('') vytvoří xml bez jakýchkoliv značek. Bude vrácena pouze jedna textová hodnota.
Když přidáte type
do for xml dotaz bude datový typ XML .
Chcete-li získat hodnotu z XML, měli byste použít value()
metoda. Mohli byste přetypovat na řetězec, ale pokud byste to udělali, dostali byste například & v řetězci všude tam, kde jste použili & .
První parametr v value() funkce je výraz xQuery používaný k získání požadované hodnoty. Použijte text() určit, že chcete hodnotu pouze pro aktuální prvek. [1] říká SQL Serveru, že chcete najít první textový uzel (zde máte pouze jeden), ale je to stále nutné.
Řetězec vytvořený pomocí for xml dotaz má na začátku řetězce navíc čárku a mezeru, kterou je třeba odstranit. Zde používám funkci XQuery substring
získat vše kromě prvních dvou znaků.
Druhý parametr k value() určuje datový typ, který má být vrácen.