Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A következőkre vonatkozik:SQL Server
Azure SQL Database
Azure 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)