Gunakan mode EKSPLISIT dengan FOR XML

Berlaku untuk:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Seperti yang dijelaskan dalam artikel, Membuat XML Menggunakan XML, RAW, dan mode OTOMATIS tidak memberikan banyak kontrol atas bentuk XML yang dihasilkan dari hasil kueri. Namun, mode EKSPLISIT memberikan fleksibilitas terbanyak dalam menghasilkan XML yang Anda inginkan dari hasil kueri.

Kueri mode EKSPLISIT harus ditulis dengan cara tertentu sehingga informasi tambahan tentang XML yang diperlukan, seperti sarang yang diharapkan dalam XML, secara eksplisit ditentukan sebagai bagian dari kueri. Bergantung pada XML yang Anda minta, menulis kueri mode EKSPLISIT bisa rumit. Anda mungkin menemukan bahwa Menggunakan Mode PATH dengan bersarang adalah alternatif yang lebih sederhana untuk menulis kueri mode EKSPLISIT.

Karena Anda menjelaskan XML yang Anda inginkan sebagai bagian dari kueri dalam mode EKSPLISIT, Anda harus memastikan bahwa XML yang dihasilkan terbentuk dengan baik dan valid.

Pemrosesan himpunan baris dalam mode EKSPLISIT

Mode EKSPLISIT mengubah kumpulan baris yang dihasilkan dari eksekusi kueri menjadi dokumen XML. Agar mode EKSPLISIT menghasilkan dokumen XML, set baris harus memiliki format tertentu. Ini mengharuskan Anda menulis kueri SELECT untuk menghasilkan set baris, tabel universal, dengan format tertentu sehingga logika pemrosesan kemudian dapat menghasilkan XML yang Anda inginkan.

Pertama, kueri harus menghasilkan dua kolom metadata berikut:

  • Kolom pertama harus menyediakan nomor tag, jenis bilangan bulat, dari elemen saat ini, dan nama kolom harus Tag. Kueri Anda harus menyediakan nomor tag unik untuk setiap elemen yang akan dibangun dari set baris.

  • Kolom kedua harus menyediakan nomor tag elemen induk, dan nama kolom ini harus Induk. Dengan cara ini, Tag dan kolom Induk menyediakan informasi hierarki.

Nilai kolom metadata ini, bersama dengan informasi dalam nama kolom, digunakan untuk menghasilkan XML yang Anda inginkan. Kueri Anda harus menyediakan nama kolom dengan cara tertentu. Perhatikan juga bahwa 0 atau NULL di kolom Induk menunjukkan bahwa elemen yang sesuai tidak memiliki induk. Elemen ditambahkan ke XML sebagai elemen tingkat atas.

Untuk memahami bagaimana tabel universal yang dihasilkan oleh kueri diproses menjadi menghasilkan hasil XML, asumsikan bahwa Anda telah menulis kueri yang menghasilkan tabel universal ini:

Sample universal table.

Perhatikan hal-hal berikut tentang tabel universal ini:

  • Dua kolom pertama adalah Tag dan Induk dan merupakan kolom meta. Nilai-nilai ini menentukan hierarki.

  • Nama kolom ditentukan dengan cara tertentu, seperti yang dijelaskan nanti dalam artikel ini.

  • Dalam menghasilkan XML dari tabel universal ini, data dalam tabel ini dipartisi secara vertikal ke dalam grup kolom. Pengelompokan ditentukan berdasarkan nilai Tag dan nama kolom. Dalam membuat XML, logika pemrosesan memilih satu grup kolom untuk setiap baris dan membuat elemen. Berikut ini berlaku dalam contoh ini:

    • Untuk nilai kolom Tag 1 di baris pertama, kolom yang namanya menyertakan nomor tag yang sama, Customer!1!cid dan Customer!1!name, membentuk grup. Kolom ini digunakan dalam memproses baris, dan Anda mungkin telah memperhatikan bahwa bentuk elemen yang dihasilkan adalah <Customer id=... name=...>. Format nama kolom dijelaskan nanti dalam artikel ini.

    • Untuk baris dengan nilai kolom Tag 2, kolom Order!2!id dan Order!2!date membentuk grup yang kemudian digunakan dalam membangun elemen, <Order id=... date=... />.

    • Untuk baris dengan nilai kolom Tag 3, kolom OrderDetail!3!id!id dan OrderDetail!3!pid!idref membentuk grup. Masing-masing baris ini menghasilkan elemen, <OrderDetail id=... pid=...>, dari kolom ini.

  • Dalam menghasilkan hierarki XML, baris diproses secara berurutan. Hierarki XML ditentukan seperti yang diperlihatkan dalam hal berikut:

    • Baris pertama menentukan nilai Tag 1 dan Nilai induk NULL. Oleh karena itu, elemen yang sesuai, <Customer> elemen, ditambahkan sebagai elemen tingkat atas di XML.

      <Customer cid="C1" name="Janine">
      
    • Baris kedua mengidentifikasi nilai Tag 2 dan Nilai induk 1. Oleh karena itu, elemen, <Order> elemen, ditambahkan sebagai turunan dari <Customer> elemen .

      <Customer cid="C1" name="Janine">
         <Order id="O1" date="1/20/1996">
      
    • Dua baris berikutnya mengidentifikasi nilai Tag 3 dan Nilai induk 2. Oleh karena itu, dua elemen, <OrderDetail> elemen, ditambahkan sebagai turunan dari <Order> elemen .

      <Customer cid="C1" name="Janine">
         <Order id="O1" date="1/20/1996">
            <OrderDetail id="OD1" pid="P1"/>
            <OrderDetail id="OD2" pid="P2"/>
      
    • Baris terakhir mengidentifikasi 2 sebagai nomor Tag dan 1 sebagai nomor tag Induk . Oleh karena itu, turunan elemen lain <Order> ditambahkan ke <Customer> elemen induk.

      <Customer cid="C1" name="Janine">
         <Order id="O1" date="1/20/1996">
            <OrderDetail id="OD1" pid="P1"/>
            <OrderDetail id="OD2" pid="P2"/>
         </Order>
         <Order id="O2" date="3/29/1997">
      </Customer>
      

Untuk meringkas, nilai dalam kolom Meta Tag dan Induk , informasi yang disediakan dalam nama kolom, dan urutan baris yang benar menghasilkan XML yang Anda inginkan saat Anda menggunakan mode EKSPLISIT.

Urutan baris tabel universal

Dalam membuat XML, baris dalam tabel universal diproses secara berurutan. Oleh karena itu, untuk mengambil instans anak yang benar yang terkait dengan induknya, baris dalam set baris harus diurutkan sehingga setiap simpul induk segera diikuti oleh anak-anaknya.

Tentukan nama kolom dalam tabel universal

Saat menulis kueri mode EKSPLISIT, nama kolom dalam himpunan baris yang dihasilkan harus ditentukan dengan menggunakan format ini. Mereka memberikan informasi transformasi termasuk elemen dan nama atribut dan informasi tambahan lainnya, yang ditentukan dengan menggunakan arahan.

Ini adalah format umum:

ElementName!TagNumber!AttributeName!Directive

Berikut ini adalah deskripsi bagian format.

  • ElementName

    Pengidentifikasi generik elemen yang dihasilkan. Misalnya, jika Pelanggan ditentukan sebagai ElementName, <Customers> elemen akan dihasilkan.

  • TagNumber

    Nilai tag unik yang ditetapkan ke elemen. Nilai ini, dengan bantuan dua kolom metadata, Tag dan Induk, menentukan bersarangnya elemen dalam XML yang dihasilkan.

  • AttributeName

    Menyediakan nama atribut yang akan dibangun di ElementName yang ditentukan. Ini adalah perilaku jika Direktif tidak ditentukan.

    Jika Direktif ditentukan dan merupakan xml, cdata, atau elemen, nilai ini digunakan untuk membangun elemen turunan dari ElementName, dan nilai kolom ditambahkan ke dalamnya.

    Jika Anda menentukan Direktif, AttributeName dapat kosong. Misalnya, ElementName! TagNumber!! Direktif. Dalam hal ini, nilai kolom secara langsung dimuat oleh ElementName.

  • Direktif

    Arahan bersifat opsional dan Anda dapat menggunakannya untuk memberikan informasi tambahan untuk konstruksi XML. Arahan memiliki dua tujuan.

    • Salah satu tujuannya adalah untuk mengodekan nilai sebagai ID, IDREF, dan IDREFS. Anda dapat menentukan kata kunci ID, IDREF, dan IDREFS sebagai Arahan. Arahan ini menimpa jenis atribut. Ini memungkinkan Anda membuat tautan intra-dokumen.

    • Selain itu, Anda dapat menggunakan Direktif untuk menunjukkan cara memetakan data string ke XML. Kata kunci hide, element, elementxsinil, xml, xmltext, dan cdata dapat digunakan sebagai Direktif. Direktif sembunyikan menyembunyikan simpul. Ini berguna saat Anda mengambil nilai hanya untuk tujuan pengurutan, tetapi Anda tidak menginginkannya dalam XML yang dihasilkan.

    Direktif elemen menghasilkan elemen yang terkandung alih-alih atribut. Data yang terkandung dikodekan sebagai entitas. Misalnya, < karakter menjadi <. Untuk nilai kolom NULL, tidak ada elemen yang dihasilkan. Jika Anda ingin elemen yang dihasilkan untuk nilai kolom null, Anda dapat menentukan direktif elementxsinil . Ini akan menghasilkan elemen yang memiliki atribut xsi:nil=TRUE.

    Direktif xml sama dengan arahan elemen , kecuali bahwa tidak ada pengodean entitas yang terjadi. Arahan elemen dapat dikombinasikan dengan ID, IDREF, atau IDREFS, sedangkan direktif xml tidak diizinkan dengan arahan lain, kecuali sembunyikan.

    Direktif cdata berisi data dengan membungkusnya dengan bagian CDATA. Konten tidak dikodekan entitas. Jenis data asli harus berupa jenis teks seperti varchar, nvarchar, teks, atau ntext. Arahan ini hanya dapat digunakan dengan sembunyikan. Ketika direktif ini digunakan, AttributeName tidak boleh ditentukan.

    Menggabungkan arahan antara kedua grup ini diizinkan dalam banyak kasus, tetapi menggabungkannya di antara mereka sendiri tidak diizinkan.

Jika Direktif dan AttributeName tidak ditentukan, misalnya, Customer!1, arahan elemen tersirat, seperti Customer!1!! elemen, dan data kolom terkandung dalam ElementName.

Jika direktif xmltext ditentukan, konten kolom dibungkus dalam satu tag yang terintegrasi dengan sisa dokumen. Direktif ini berguna dalam mengambil data XML luapan, tidak dikonsumsi, disimpan dalam kolom oleh OPENXML. Untuk informasi selengkapnya, lihat OPENXML (SQL Server).

Jika AttributeName ditentukan, nama tag digantikan dengan nama yang ditentukan. Jika tidak, atribut ditambahkan ke daftar atribut saat ini dari elemen penutup dengan menempatkan konten di awal penahanan tanpa pengodean entitas. Kolom dengan direktif ini harus berupa jenis teks, seperti varchar, nvarchar, char, nchar, text, atau ntext. Arahan ini hanya dapat digunakan dengan sembunyikan. Arahan ini berguna dalam mengambil data luapan yang disimpan dalam kolom. Jika konten bukan XML yang terbentuk dengan baik, perilaku tidak terdefinisi.

Langkah berikutnya

Contoh berikut mengilustrasikan penggunaan mode EKSPLISIT.

Baca juga