Bagikan melalui


Pemformatan XML sisi klien vs. Sisi server (SQLXML 4.0)

Berlaku untuk: SQL ServerAzure SQL Database Azure SQL Managed Instance

Topik ini menjelaskan perbedaan umum antara pemformatan XML sisi klien dan sisi server di SQLXML.

Beberapa Kueri Set Baris Tidak Didukung dalam Pemformatan Sisi Klien

Kueri yang menghasilkan beberapa set baris tidak didukung saat Anda menggunakan pemformatan XML sisi klien. Misalnya, asumsikan Anda memiliki direktori virtual tempat Anda memiliki pemformatan sisi klien yang ditentukan. Pertimbangkan templat sampel ini, yang memiliki dua pernyataan SELECT dalam <blok sql:query> :

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  
  <sql:query>  
     SELECT FirstName FROM Person.Contact FOR XML Nested;   
     SELECT LastName FROM Person.Contact FOR XML Nested    
  </sql:query>  
</ROOT>  

Anda dapat menjalankan templat ini dalam kode aplikasi dan kesalahan dikembalikan, karena pemformatan XML sisi klien tidak mendukung pemformatan beberapa set baris. Jika Anda menentukan kueri dalam dua blok sql:query> terpisah<, Anda akan mendapatkan hasil yang diinginkan.

Peta tanda waktu Berbeda dalam Pemformatan Sisi Klien- vs. Sisi Server

Dalam pemformatan XML sisi server, kolom database jenis tanda waktu memetakan ke jenis XDR i8 (saat opsi XMLDATA ditentukan dalam kueri).

Dalam pemformatan XML sisi klien, kolom database jenis tanda waktu dipetakan ke jenis XDR bin.base64 atau uri (tergantung pada apakah opsi base64 biner ditentukan dalam kueri). Jenis XDR bin.base64 berguna jika Anda menggunakan fitur updategram dan bulkload, karena jenis ini dikonversi ke jenis tanda waktu SQL Server. Dengan cara ini, operasi sisipkan, perbarui, atau hapus berhasil.

VARIAN Mendalam Digunakan dalam Pemformatan Sisi Server

Dalam pemformatan XML sisi server, jenis mendalam dari jenis VARIAN digunakan. Jika Anda menggunakan pemformatan XML sisi klien, varian dikonversi ke string Unicode, dan subjenis VARIAN tidak digunakan.

Mode BERLAPIS vs. Mode OTOMATIS

Mode NESTED dari sisi klien UNTUK XML mirip dengan mode OTOMATIS sisi server UNTUK XML, dengan pengecualian berikut:

Saat Anda mengkueri tampilan menggunakan mode OTOMATIS di sisi server, nama tampilan dikembalikan sebagai nama elemen dalam XML yang dihasilkan.

Misalnya, asumsikan bahwa tampilan berikut dibuat pada tabel Person.Contact di AdventureWorksdatabase:

CREATE VIEW ContactView AS (SELECT ContactID as CID,  
                               FirstName  as FName,  
                               LastName  as LName  
                        FROM Person.Contact)  

Templat berikut menentukan kueri terhadap tampilan ContactView, dan juga menentukan pemformatan XML sisi server:

 <ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  
  <sql:query client-side-xml="0">  
    SELECT *  
    FROM   ContactView  
    FOR XML AUTO  
  </sql:query>  
</ROOT>  

Saat Anda menjalankan templat, XML berikut dikembalikan. (Hanya hasil parsial yang ditampilkan.) Perhatikan bahwa nama elemen adalah nama tampilan tempat kueri dijalankan.

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  
  <ContactView CID="1" FName="Gustavo" LName="Achong" />   
  <ContactView CID="2" FName="Catherine" LName="Abel" />   
...  
</ROOT>  

Saat Anda menentukan pemformatan XML sisi klien dengan menggunakan mode NESTED yang sesuai, nama tabel dasar dikembalikan sebagai nama elemen dalam XML yang dihasilkan. Misalnya, templat yang direvisi berikut menjalankan pernyataan SELECT yang sama, tetapi pemformatan XML dilakukan di sisi klien (yaitu, client-side-xml diatur ke true dalam templat):

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  
  <sql:query client-side-xml="1">  
    SELECT *  
    FROM   ContactView  
    FOR XML NESTED  
  </sql:query>  
</ROOT>  

Menjalankan templat ini menghasilkan XML berikut. Perhatikan bahwa nama elemen adalah nama tabel dasar dalam kasus ini.

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  
  <Person.Contact CID="1" FName="Gustavo" LName="Achong" />   
  <Person.Contact CID="2" FName="Catherine" LName="Abel" />   
...  
</ROOT>  

Saat Anda menggunakan mode OTOMATIS dari sisi server UNTUK XML, alias tabel yang ditentukan dalam kueri dikembalikan sebagai nama elemen dalam XML yang dihasilkan.

Misalnya, pertimbangkan templat ini:

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  
  <sql:query client-side-xml="0">  
    SELECT FirstName as fname,  
           LastName as lname  
    FROM   Person.Contact C  
    FOR XML AUTO  
  </sql:query>  
</ROOT>  

Menjalankan templat menghasilkan XML berikut:

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  
  <C fname="Gustavo" lname="Achong" />   
  <C fname="Catherine" lname="Abel" />   
...  
</ROOT>   

Saat Anda menggunakan mode NESTED dari SISI klien UNTUK XML, nama tabel dikembalikan sebagai nama elemen dalam XML yang dihasilkan. (Alias tabel yang ditentukan dalam kueri tidak digunakan.) Misalnya, pertimbangkan templat ini:

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  
  <sql:query client-side-xml="1">  
    SELECT FirstName as fname,  
           LastName as lname  
    FROM   Person.Contact C  
    FOR XML NESTED  
  </sql:query>  
</ROOT>  

Menjalankan templat menghasilkan XML berikut:

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  
  <Person.Contact fname="Gustavo" lname="Achong" />   
  <Person.Contact fname="Catherine" lname="Abel" />   
...  
</ROOT>  

Jika Anda memiliki kueri yang mengembalikan kolom sebagai kueri dbobject, Anda tidak dapat menggunakan alias untuk kolom ini.

Misalnya, pertimbangkan templat berikut, yang menjalankan kueri yang mengembalikan ID karyawan dan foto.

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  
<sql:query client-side-xml="1">  
   SELECT ProductPhotoID, LargePhoto as P  
   FROM   Production.ProductPhoto  
   WHERE  ProductPhotoID=5  
   FOR XML NESTED, elements  
</sql:query>  
</ROOT>  

Menjalankan templat ini mengembalikan kolom Foto sebagai kueri dbobject. Dalam kueri dbobject ini, @P mengacu pada nama kolom yang tidak ada.

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  
  <Production.ProductPhoto>  
    <ProductPhotoID>5</ProductPhotoID>  
    <LargePhoto>dbobject/Production.ProductPhoto[@ProductPhotoID='5']/@P</LargePhoto>  
  </Production.ProductPhoto>  
</ROOT>  

Jika pemformatan XML dilakukan di server (client-side-xml="0"), Anda dapat menggunakan alias untuk kolom yang mengembalikan kueri dbobject tempat nama tabel dan kolom aktual dikembalikan (bahkan jika Anda memiliki alias yang ditentukan). Misalnya, templat berikut menjalankan kueri, dan pemformatan XML dilakukan di server ( opsi client-side-xml tidak ditentukan dan opsi Jalankan Pada Klien tidak dipilih untuk akar virtual). Kueri juga menentukan mode OTOMATIS (bukan mode NESTED sisi klien).

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  
<sql:query   
   SELECT ProductPhotoID, LargePhoto as P  
   FROM   Production.ProductPhoto  
   WHERE  ProductPhotoID=5  
   FOR XML AUTO, elements  
</sql:query>  
</ROOT>  

Ketika templat ini dijalankan, dokumen XML berikut dikembalikan (perhatikan bahwa alias tidak digunakan dalam kueri dbobject untuk kolom LargePhoto):

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  
  <Production.ProductPhoto>  
    <ProductPhotoID>5</ProductPhotoID>  
    <LargePhoto>dbobject/Production.ProductPhoto[@ProductPhotoID='5']/@LargePhoto</LargePhoto>  
  </Production.ProductPhoto>  
</ROOT>  

Sisi klien vs. Server-side XPath

XPath sisi klien dan XPath sisi server berfungsi sama kecuali untuk perbedaan ini:

  • Konversi data yang diterapkan saat Anda menggunakan kueri XPath sisi klien berbeda dari yang diterapkan saat Anda menggunakan kueri XPath sisi server. XPath sisi klien menggunakan CAST alih-alih mode CONVERT 126.

  • Saat Anda menentukan client-side-xml="0" (false) dalam templat, Anda meminta pemformatan XML sisi server. Oleh karena itu, Anda tidak dapat menentukan FOR XML NESTED karena server tidak mengenali opsi NESTED. Ini menghasilkan kesalahan. Anda harus menggunakan mode AUTO, RAW, atau EXPLICIT, yang dikenali server.

  • Saat Anda menentukan client-side-xml="1" (true) dalam templat, Anda meminta pemformatan XML sisi klien. Dalam hal ini, Anda dapat menentukan FOR XML NESTED. Jika Anda menentukan FOR XML AUTO, pemformatan XML terjadi di sisi server meskipun client-side-xml="1" ditentukan dalam templat.

Lihat Juga

UNTUK Pertimbangan Keamanan XML (SQLXML 4.0)
Pemformatan XML sisi klien (SQLXML 4.0)
Pemformatan XML sisi server (SQLXML 4.0)