Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

UNTUK XML PATH di SQL server dan [text()]

Jawaban saat ini lainnya tidak menjelaskan banyak tentang dari mana asalnya, atau hanya menawarkan tautan ke situs yang diformat dengan buruk dan tidak benar-benar menjawab pertanyaan.

Di banyak jawaban di web untuk mengelompokkan string ada jawaban salin tempel tanpa banyak penjelasan tentang apa yang terjadi. Saya ingin menjawab pertanyaan ini dengan lebih baik karena saya bertanya-tanya hal yang sama, dan juga memberikan wawasan tentang apa yang sebenarnya terjadi secara keseluruhan.

tldr;

Singkatnya, ini adalah sintaks untuk membantu mengubah keluaran XML saat menggunakan FOR XML PATH yang menggunakan nama kolom (atau alias) untuk menyusun output. Jika Anda memberi nama kolom Anda text() data akan direpresentasikan sebagai teks dalam tag root.

<row>
    My record's data
<row>

Dalam contoh yang Anda lihat online tentang cara mengelompokkan string dan menggabungkan dengan , itu mungkin tidak jelas (kecuali untuk fakta bahwa kueri Anda memiliki for xml kecil itu part) bahwa Anda sebenarnya sedang membangun file XML dengan struktur tertentu (atau lebih tepatnya, kurangnya struktur) dengan menggunakan FOR XML PATH ('') . ('') sedang menghapus tag root xml, dan hanya mengeluarkan datanya.

Kesepakatan dengan AS [text()]

Seperti biasa, AS bertindak untuk memberi nama atau mengganti nama alias kolom. Dalam contoh ini, Anda membuat alias kolom ini sebagai [text()] . [] s hanyalah pembatas kolom standar SQL Server, seringkali tidak dibutuhkan, kecuali hari ini karena nama kolom kami memiliki () s. Itu meninggalkan kita dengan text() untuk nama kolom kami.

Mengontrol Struktur XML dengan Nama Kolom

Saat Anda menggunakan FOR XML PATH Anda mengeluarkan file XML dan dapat mengontrol struktur dengan nama kolom Anda. Daftar opsi yang terperinci dapat ditemukan di sini:https://msdn.microsoft. .com/en-us/library/ms189885.aspx

Contohnya termasuk memulai nama kolom Anda dengan tanda @, seperti:

SELECT color as '@color', name
FROM #favorite_colors
FOR XML PATH

Ini akan memindahkan data kolom ini ke atribut baris xml saat ini, bukan item di dalamnya. Anda berakhir dengan

<row color="red">
  <name>tim</name>
</row>
<row color="blue">
  <name>that guy</name>
</row>

Jadi, kembali ke [text()] . Ini sebenarnya menentukan Uji Node XPath . Dalam konteks MS Sql Server, Anda dapat mempelajari tentang penunjukan ini di sini . Pada dasarnya ini membantu menentukan jenis elemen tempat kita menambahkan data ini, seperti simpul normal (default), komentar xml, atau dalam contoh ini, beberapa teks di dalam tag.

Contoh menggunakan beberapa gerakan untuk menyusun output

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

Perhatikan bahwa kami menggunakan beberapa sebutan dalam nama kolom kami:

  • @color :atribut tag
  • text() :beberapa teks untuk tag root ini
  • comment() :komentar xml
  • info/text() :beberapa teks dalam tag xml tertentu, <info>

Outputnya terlihat seperti ini:

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

Selesaikan, bagaimana alat ini dapat mengelompokkan dan menggabungkan string?

Jadi, dengan solusi yang kita lihat untuk mengelompokkan string menggunakan FOR XML PATH , ada dua komponen kunci.

  • AS [text()] :Menulis data sebagai teks, bukan membungkusnya dengan tag
  • FOR XML PATH ('') :Mengganti nama tag root menjadi '' , atau lebih tepatnya, menghapusnya sepenuhnya

Ini memberi kita keluaran "XML" (tanda kutip udara) yang pada dasarnya hanyalah sebuah string.

SELECT name + ', ' AS [text()] -- no 'name' tags
FROM #favorite_colors
FOR XML PATH ('')  -- no root tag

kembali

tim, that guy, 

Dari sana, hanya masalah menggabungkan data itu kembali ke kumpulan data yang lebih besar dari mana asalnya.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. tidak dapat memperbarui gambar profil menggunakan varbinary

  2. Cara Membuat Prosedur Tersimpan di SQL Server

  3. Bagaimana cara memilih data dari 30 hari?

  4. Operator XOR T-SQL

  5. Gunakan SET TEXTSIZE untuk Membatasi Data yang Dikembalikan untuk Setiap Baris di SQL Server