untuk output jalur xml ('')

9

Ketika saya menjalankan yang berikut ini

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

Saya menerima output ini

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

Jika saya menjalankan yang berikut ini

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

Saya menerima output ini

Green/Blue/Red/

Mengapa menambahkan rangkaian dalam lead pilih untuk menghapus tag jenis dan output pada satu baris dalam file xml? Menjalankan SQL Server 2012.

kevinnwhat
sumber

Jawaban:

15

XML gila

Saat Anda menambahkan string yang digabungkan, Anda kehilangan "elemen path".

Sebagai contoh jika Anda melakukan ini:

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');

Anda mendapatkan ini kembali:

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

Nama kolom atau alias bertindak sebagai elemen jalur.

Beberapa contoh lain yang mungkin bisa membantu

Menggunakan 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;

Pada contoh pertama, Anda mendapatkan nama elemen "baris" yang umum, tetapi pada yang kedua Anda mendapatkan baris / jenis.

Saat menggunakan 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;

Kueri pertama menghasilkan XML yang valid-ish, yang kedua melempar kesalahan karena elemen jalan tidak memiliki pengidentifikasi.

Menggunakan AUTO, alias tabel dan nama kolom berubah menjadi jalur:

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;

Tetapi tanpa alias, Anda mendapatkan kesalahan serupa:

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

Saya akan membuat contoh dengan FOR XML EXPLICITtetapi tidak bertanggung jawab bagi saya untuk mulai minum sekarang.

Erik Darling
sumber