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.