Các câu trả lời hiện tại khác không giải thích nhiều về việc điều này đến từ đâu, hoặc chỉ cung cấp các liên kết đến các trang web có định dạng kém và không thực sự trả lời câu hỏi.
Trong nhiều câu trả lời trên web để nhóm các chuỗi có những câu trả lời sao chép dán mà không có nhiều lời giải thích về những gì đang xảy ra. Tôi muốn trả lời câu hỏi này tốt hơn bởi vì tôi cũng đang thắc mắc điều tương tự, đồng thời cung cấp thông tin chi tiết về những gì đang thực sự xảy ra về tổng thể.
tldr;
Tóm lại, đây là cú pháp để giúp chuyển đổi đầu ra XML khi sử dụng FOR XML PATH
trong đó sử dụng tên cột (hoặc bí danh) để cấu trúc đầu ra. Nếu bạn đặt tên cho cột của mình là text()
dữ liệu sẽ được biểu diễn dưới dạng văn bản trong thẻ gốc.
<row>
My record's data
<row>
Trong các ví dụ bạn thấy trực tuyến để biết cách nhóm các chuỗi và nối với ,
nó có thể không rõ ràng (ngoại trừ thực tế là truy vấn của bạn có for xml
nhỏ đó phần) mà bạn thực sự đang xây dựng một tệp XML có cấu trúc cụ thể (hay đúng hơn là thiếu cấu trúc) bằng cách sử dụng FOR XML PATH ('')
. ('')
đang xóa các thẻ xml gốc và chỉ lấy ra dữ liệu.
Giao dịch với AS [text()]
Như thường lệ, AS
đang hành động để đặt tên hoặc đổi tên bí danh cột. Trong ví dụ này, bạn đặt bí danh cho cột này là [text()]
. []
s chỉ đơn giản là các dấu phân cách cột tiêu chuẩn của SQL Server, thường không cần thiết, ngoại trừ ngày nay vì tên cột của chúng ta có ()
S. Điều đó để lại cho chúng tôi text()
cho tên cột của chúng tôi.
Kiểm soát cấu trúc XML với tên cột
Khi bạn đang sử dụng FOR XML PATH
bạn đang xuất ra một tệp XML và có thể kiểm soát cấu trúc bằng các tên cột của bạn. Bạn có thể tìm thấy danh sách chi tiết các tùy chọn tại đây: https://msdn.microsoft .com / en-us / library / ms189885.aspx
Một ví dụ bao gồm việc bắt đầu tên cột của bạn bằng dấu @, chẳng hạn như:
SELECT color as '@color', name
FROM #favorite_colors
FOR XML PATH
Thao tác này sẽ di chuyển dữ liệu của cột này sang một thuộc tính của hàng xml hiện tại, trái ngược với một mục bên trong nó. Bạn kết thúc với
<row color="red">
<name>tim</name>
</row>
<row color="blue">
<name>that guy</name>
</row>
Vì vậy, sau đó, quay lại [text()]
. Điều này thực sự chỉ định một Kiểm tra nút XPath
. Trong ngữ cảnh của MS Sql Server, bạn có thể tìm hiểu về chỉ định này tại đây . Về cơ bản, nó giúp xác định loại phần tử mà chúng tôi đang thêm dữ liệu này vào, chẳng hạn như nút bình thường (mặc định), nhận xét xml hoặc trong ví dụ này, một số văn bản trong thẻ.
Một ví dụ sử dụng một vài bước di chuyển để cấu trúc đầu ra
SELECT
color as [@color]
,'Some info about ' + name AS [text()]
,name + ' likes ' + color AS [comment()]
,name
,name + ' has some ' + color + ' things' AS [info/text()]
FROM #favorite_colors
FOR XML PATH
Lưu ý rằng chúng tôi đang sử dụng một số ký hiệu trong tên cột của mình:
-
@color
:một thuộc tính thẻ -
text()
:một số văn bản cho thẻ gốc này -
comment()
:một bình luận xml -
info/text()
:một số văn bản trong thẻ xml cụ thể,<info>
Đầu ra giống như sau:
<row color="red">
Some info about tim
<!--tim likes red-->
<name>tim</name>
<info>tim has some red things</info>
</row>
<row color="blue">
Some info about that guy
<!--that guy likes blue-->
<name>that guy</name>
<info>that guy has some blue things</info>
</row>
Kết thúc nó, làm cách nào những công cụ này có thể nhóm và nối các chuỗi?
Vì vậy, với các giải pháp mà chúng tôi thấy để nhóm các chuỗi lại với nhau bằng cách sử dụng FOR XML PATH
, có hai thành phần chính.
-
AS [text()]
:Ghi dữ liệu dưới dạng văn bản, thay vì gói nó trong thẻ -
FOR XML PATH ('')
:Đổi tên thẻ gốc thành''
hay đúng hơn là xóa nó hoàn toàn
Điều này cung cấp cho chúng tôi đầu ra "XML" (dấu ngoặc kép) về cơ bản chỉ là một chuỗi.
SELECT name + ', ' AS [text()] -- no 'name' tags
FROM #favorite_colors
FOR XML PATH ('') -- no root tag
lợi nhuận
tim, that guy,
Từ đó, chỉ cần kết hợp dữ liệu đó trở lại tập dữ liệu lớn hơn mà từ đó nó đến.