Megosztás a következőn keresztül:


Kliens oldali vs. szerveroldali XML formázás (SQLXML 4.0)

A következőkre vonatkozik:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Ez a téma az ügyféloldali és szerveroldali XML formázás általános különbségeit írja le SQLXML-ben.

Többszörös sorhalmaz lekérdezések nem támogatottak kliens oldali formázásban

Azok a lekérdezések, amelyek több sorhalmazt generálnak, nem támogatottak kliensoldali XML formázás esetén. Például tegyük fel, hogy van egy virtuális könyvtárad, amelyben kliensoldali formázás van megadva. Vegyük ezt a mintasablont, amelynek két SELECT utasítása van egy <sql:query> blokkban:

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

Ezt a sablont futtathatod alkalmazáskódban, és hiba jelenik meg, mert az ügyféloldali XML formázás nem támogatja több sorhalmaz formázását. Ha két külön <sql:query> blokkban határozod meg a lekérdezéseket, a kívánt eredményt kapod.

Időbélyeg Térképek eltérően kliens és szerveroldali formázásban

Szerveroldali XML formázásban az időbélyeg típusú adatbázisoszlop az i8 XDR típushoz fordul (amikor az XMLDATA opció a lekérdezésben meg van jelölve).

Kliensoldali XML formázásban az időbélyeg típusú adatbázis-oszlop vagy az uri-hoz , vagy a bin.base64 XDR típushoz kapcsolódik (attól függően, hogy a bináris base64 opció meg van jelölve a lekérdezésben). A bin.base64 XDR típus hasznos, ha az updategram és bulkload funkciókat használod, mert ez a típus SQL Server timestamp típusra van átalakítva. Így a betöltés, frissítés vagy törlés művelet sikeres lesz.

Mély VÁLTOZATOKAT használnak szerveroldali formázásban

Szerveroldali XML formázásban a VARIANT típusú mély típusokat használják. Ha kliensoldali XML formázást használsz, a variánsok Unicode stringre konvertálódnak, és a VARIANT altípusai nem kerülnek használatra.

NESTED mód vs. AUTO mód

Az ügyféloldali FOR XML NESTED módja hasonló a szerveroldali FOR XML AUTO módjához, a következő kivételekkel:

Amikor AUTO módban lekérdezést keresel a szerveroldalon, a nézet neve jelenik meg elem neveként az eredményes XML-ben.

Tegyük fel, hogy a következő nézet jön létre az AdventureWorks adatbázis Person.Contact tábláján:

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

A következő sablon egy lekérdezést ad meg a ContactView nézeten, és a szerveroldali XML formázást is:

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

Amikor futtatod a sablont, a következő XML jelenik meg. (Csak részleges eredmények láthatók.) Fontos megjegyezni, hogy az elemnevek azok a nézetek nevei, amelyekhez a lekérdezés végrehajtható.

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

Amikor a kliens oldali XML formázást a megfelelő NESTED móddal megadod, az alaptábla nevei az eredeti XML-ben elem névként térnek vissza. Például a következő módosított sablon ugyanazt a SELECT utasítást hajtja végre, de az XML formázás a kliens oldalon történik (azaz a kliens oldali-xml a sablonban true -re van állítva):

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

Ennek a sablonnak a végrehajtása a következő XML-t eredményezi. Fontos megjegyezni, hogy ebben az esetben az elem neve az alaptábla neve.

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

Amikor a szerveroldali FOR XML AUTO módját használjuk, a lekérdezésben megadott tábla-aliasok elemnevekként térnek vissza az eredményes XML-ben.

Például vegyük ezt a sablont:

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

A sablon végrehajtása a következő XML-t eredményezi:

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

Amikor a kliensoldali FOR XML NESTED módját használjuk, a táblanevek elemnevekként térnek vissza az eredményes XML-ben. (A lekérdezésben megadott táblázat aliazsokat nem használják.) Például vegyük ezt a sablont:

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

A sablon végrehajtása a következő XML-t eredményezi:

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

Ha van egy lekérdezésed, amely oszlopokat dbobject lekérdezésként ad vissza, akkor ezekhez az oszlopokhoz nem használhatsz aliasokat.

Például vegyük a következő sablont, amely egy lekérdezést hajt végre, amely egy alkalmazotti azonosítót és egy fényképet ad vissza.

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

A sablon végrehajtása a Fotó oszlopot dbobject lekérdezésként adja vissza. Ebben a dbobject lekérdezésben @P egy olyan oszlopnévre utal, amely nem létezik.

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

Ha az XML formázás a szerveren történik (kliensoldali-xml="0"), akkor az aliast használhatod azokra az oszlopokra, amelyek dbobject lekérdezéseket adnak vissza, amelyekben tényleges táb- és oszlopnevek jelennek meg (még akkor is, ha vannak megadva aliasok). Például a következő sablon futtat egy lekérdezést, és az XML formázás a szerveren történik (a kliens oldali xml opció nincs megadva, és a Run On Client opció nincs kiválasztva a virtuális root esetében). A lekérdezés megadja az AUTO módot is (nem a kliens oldali NESTED módot).

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

Amikor ezt a sablont futtatják, a következő XML dokumentum jelenik meg (megjegyzendő, hogy a dbobject lekérdezésben a LargePhoto oszlopban nem használják aliasokat):

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

Kliens oldal vs. szerveroldali XPath

Az ügyféloldali XPath és a szerveroldali XPath ugyanúgy működik, kivéve ezeket a különbségeket:

  • Az adatátalakítások, amelyeket kliensoldali XPath lekérdezéseknél alkalmazunk, eltérnek azoktól, amelyeket szerveroldali XPath lekérdezéseknél alkalmaznak. Az ügyféloldali XPath a CAST módot használja a CONVERT mód 126 helyett.

  • Amikor egy sablonban megadod a kliensoldali-xml="0" (hamis) formázást, szerveroldali XML formázást kérsz. Ezért nem lehet megadni az XML NESTED opciót, mert a szerver nem ismeri fel a NESTED opciót. Ez hibát okoz. A AUTO, RAW vagy EXPLICIT módokat kell használni, amelyeket a szerver felismer.

  • Amikor egy sablonban megadod a kliensoldali-xml="1" (true) formázást, akkor kliensoldali XML formázást kérsz. Ebben az esetben megadhatod az XML NESTED opciót. Ha az XML AUTO beállítást adjuk meg, az XML formázás a szerver oldalon történik, bár a sablonban a kliensoldali xml="1 " szerepel.

Lásd még:

FOR XML biztonsági szempontok (SQLXML 4.0)
Kliensoldali XML formating (SQLXML 4.0)
Szerveroldali XML formázás (SQLXML 4.0)