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.

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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.