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
Membedah kueri
Kueri utama melakukan group by
jadi Anda hanya mendapatkan satu baris untuk setiap EntryID
.
Kolom TagsCommaDelimited
dibuat dengan subquery yang berkorelasi.
Di SQL Server for xml path
digunakan untuk membuat representasi XML dari hasil kueri. Anda memiliki kontrol yang baik atas cara XML dibuat dengan menggunakan alias kolom dan parameter ke path
dan root
.
Nilai gabungan ', '+T.Name
di subquery terkait tidak akan memiliki nama kolom dan parameter kosong ke for xml path('')
membuat xml tanpa tag sama sekali. Hanya akan ada satu nilai teks yang dikembalikan.
Saat Anda menambahkan type
ke for xml
kueri tipe datanya adalah XML
.
Untuk mendapatkan nilai dari XML, Anda harus menggunakan value()
metode. Anda dapat menggunakan string tetapi jika Anda melakukannya, misalnya, Anda akan mendapatkan &
dalam string di mana pun Anda telah menggunakan &
.
Parameter pertama di value()
function adalah ekspresi xQuery yang digunakan untuk mendapatkan nilai yang Anda inginkan. Gunakan text()
untuk menentukan bahwa Anda hanya menginginkan nilai untuk elemen saat ini. [1]
memberi tahu SQL Server bahwa Anda ingin simpul teks pertama ditemukan (Anda hanya memiliki satu di sini) tetapi masih diperlukan.
String yang dibuat oleh for xml
kueri memiliki koma tambahan dan spasi di awal string dan itu perlu dihapus. Disini saya menggunakan fungsi XQuery substring
untuk mendapatkan semuanya kecuali dua karakter pertama.
Parameter kedua untuk value()
menentukan tipe data yang harus dikembalikan.