Đây là cách nó hoạt động:
1. Nhận chuỗi phần tử XML với FOR XML
Thêm FOR XML PATH vào cuối truy vấn cho phép bạn xuất kết quả của truy vấn dưới dạng phần tử XML, với tên phần tử có trong đối số PATH. Ví dụ:nếu chúng ta chạy câu lệnh sau:
SELECT ',' + name
FROM temp1
FOR XML PATH ('')
Bằng cách chuyển vào một chuỗi trống (FOR XML PATH ('')), thay vào đó chúng tôi nhận được như sau:
,aaa,bbb,ccc,ddd,eee
2. Xóa dấu phẩy ở đầu bằng STUFF
Câu lệnh STUFF theo nghĩa đen là "nhồi" một chuỗi vào một chuỗi khác, thay thế các ký tự trong chuỗi đầu tiên. Tuy nhiên, chúng tôi sử dụng nó đơn giản để xóa ký tự đầu tiên của danh sách giá trị kết quả.
SELECT abc = STUFF((
SELECT ',' + NAME
FROM temp1
FOR XML PATH('')
), 1, 1, '')
FROM temp1
Các tham số của STUFF
là:
- Chuỗi được "nhồi" (trong trường hợp của chúng tôi là danh sách tên đầy đủ với dấu phẩy xếp trước)
- Vị trí để bắt đầu xóa và chèn ký tự (1, chúng tôi đang nhồi nhét vào một chuỗi trống)
- Số ký tự cần xóa (1, là dấu phẩy đứng đầu)
Vì vậy, chúng tôi kết thúc với:
aaa,bbb,ccc,ddd,eee
3. Tham gia trên id để có danh sách đầy đủ
Tiếp theo, chúng ta chỉ cần nối nó vào danh sách id trong bảng tạm thời, để có được danh sách các ID với tên:
SELECT ID, abc = STUFF(
(SELECT ',' + name
FROM temp1 t1
WHERE t1.id = t2.id
FOR XML PATH (''))
, 1, 1, '') from temp1 t2
group by id;
Và chúng tôi có kết quả:
Hy vọng điều này sẽ hữu ích!