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
Phân tích truy vấn
Truy vấn chính thực hiện một nhóm group by
vì vậy bạn chỉ nhận được một hàng cho mỗi EntryID
.
Cột TagsCommaDelimited
được tạo bằng một truy vấn con tương quan.
Trong SQL Server, for xml path
được sử dụng để tạo biểu diễn XML của một kết quả truy vấn. Bạn có quyền kiểm soát tốt cách XML được tạo bằng cách sử dụng bí danh cột và các tham số đến path
và root
.
Giá trị được nối ', '+T.Name
trong truy vấn con được corelated sẽ không có tên cột và tham số trống đến for xml path('')
tạo xml mà không có bất kỳ thẻ nào cả. Sẽ chỉ có một giá trị văn bản được trả về.
Khi bạn thêm type
thành for xml
truy vấn kiểu dữ liệu sẽ là XML
.
Để lấy giá trị từ XML, bạn nên sử dụng giá trị value()
phương pháp. Bạn có thể truyền sang một chuỗi nhưng nếu làm như vậy, chẳng hạn bạn sẽ nhận được &
trong chuỗi bất cứ nơi nào bạn đã sử dụng &
.
Tham số đầu tiên trong value()
hàm là biểu thức xQuery được sử dụng để nhận giá trị bạn muốn. Sử dụng text()
để chỉ định rằng bạn chỉ muốn giá trị cho phần tử hiện tại. [1]
nói với SQL Server rằng bạn muốn tìm thấy nút văn bản đầu tiên (bạn chỉ có một nút ở đây) nhưng nó vẫn cần thiết.
Chuỗi được tạo bởi for xml
truy vấn có thêm dấu phẩy và khoảng trắng ở đầu chuỗi và cần được xóa. Ở đây tôi sử dụng hàm XQuery substring
để lấy mọi thứ trừ hai ký tự đầu tiên.
Tham số thứ hai cho value()
chỉ định kiểu dữ liệu sẽ được trả về.