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 tagtext()
:beberapa teks untuk tag root inicomment()
:komentar xmlinfo/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 tagFOR 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.