cho đầu ra đường dẫn xml ('')


9

Khi tôi chạy như sau

select t.type
  from (values ('Green'),('Blue'),('Red')) as t(type)
   for xml path('')

Tôi nhận được đầu ra này

<type>Green</type>
<type>Blue</type>
<type>Red</type>

Nếu tôi chạy như sau

select t.type + '/'
  from (values ('Green'),('Blue'),('Red')) as t(type)
   for xml path('')

Tôi nhận được đầu ra này

Green/Blue/Red/

Tại sao việc thêm nối trong phần chọn dẫn đến loại bỏ các loại thẻ và đầu ra trên một dòng trong tệp xml? Chạy SQL Server 2012.

Câu trả lời:


15

XML là bonkers

Khi bạn thêm chuỗi nối, bạn sẽ mất "phần tử đường dẫn".

Ví dụ: nếu bạn làm điều này:

SELECT t.type + '/' AS type
FROM   ( VALUES ( 'Green' ), ( 'Blue' ), ( 'Red' )) AS t ( type )
FOR XML PATH('');

SELECT t.type + '/' 
FROM   ( VALUES ( 'Green' ), ( 'Blue' ), ( 'Red' )) AS t ( type )
FOR XML PATH('type');

Bạn lấy lại cái này:

<type>Green/</type>
<type>Blue/</type>
<type>Red/</type>

Tên cột hoặc bí danh đóng vai trò là thành phần đường dẫn.

Một số ví dụ khác có thể giúp

Sử dụng RAW, ELEMENTS

SELECT t.type + '/'
FROM   ( VALUES ( 'Green' ), ( 'Blue' ), ( 'Red' )) AS t ( type )
FOR XML RAW, ELEMENTS;

SELECT t.type + '/' AS type
FROM   ( VALUES ( 'Green' ), ( 'Blue' ), ( 'Red' )) AS t ( type )
FOR XML RAW, ELEMENTS;

Trong ví dụ đầu tiên, bạn nhận được tên thành phần "hàng" chung, nhưng trong lần thứ hai bạn nhận được hàng / loại.

Khi sử dụng RAW, TYPE:

SELECT t.type + '/' AS type
FROM   ( VALUES ( 'Green' ), ( 'Blue' ), ( 'Red' )) AS t ( type )
FOR XML RAW, TYPE;

SELECT t.type + '/'
FROM   ( VALUES ( 'Green' ), ( 'Blue' ), ( 'Red' )) AS t ( type )
FOR XML RAW, TYPE;

Truy vấn đầu tiên trả về XML hợp lệ-ish, lần thứ hai đưa ra lỗi vì phần tử đường dẫn thiếu mã định danh.

Sử dụng AUTO, bí danh bảng và tên cột biến thành đường dẫn:

SELECT type + '/' AS type
FROM   ( VALUES ( 'Green' ), ( 'Blue' ), ( 'Red' )) AS t ( type )
FOR XML AUTO;

SELECT type 
FROM   ( VALUES ( 'Green' ), ( 'Blue' ), ( 'Red' )) AS t ( type )
FOR XML AUTO;

Nhưng không có bí danh, bạn sẽ gặp một lỗi tương tự:

SELECT type + '/'
FROM   ( VALUES ( 'Green' ), ( 'Blue' ), ( 'Red' )) AS t ( type )
FOR XML AUTO;

Tôi muốn lấy một ví dụ với FOR XML EXPLICITnhưng nó sẽ vô trách nhiệm khi tôi bắt đầu uống ngay bây giờ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.