Not
Åtkomst till denna sida kräver auktorisation. Du kan prova att logga in eller byta katalog.
Åtkomst till denna sida kräver auktorisation. Du kan prova att byta katalog.
gäller för:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Detta ämne beskriver de allmänna skillnaderna mellan klient- och serverside-XML-formatering i SQLXML.
Flera raduppsättningsfrågor som inte stöds i klientsidans formatering
Frågor som genererar flera raduppsättningar stöds inte när du använder klient-sida XML-formatering. Till exempel, anta att du har en virtuell katalog där du har angiven klientsidans formatering. Betrakta denna exempelmall, som har två SELECT-satser i ett <sql:query-block> :
<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>
Du kan köra denna mall i applikationskod och ett felmeddelande returneras, eftersom klientsidans XML-formatering inte stödjer formatering av flera raduppsättningar. Om du specificerar frågorna i två separata <sql:query-block> får du önskade resultat.
tidsstämpel kartläggs olika i klient- jämfört med serverbaserad formatering
I server-side XML-formatering mappas databaskolumnen med tidsstämpeltyp till i8 XDR-typen (när XMLDATA-alternativet anges i frågan).
I klientsidans XML-formatering mappas databaskolumnen med tidsstämpel antingen till uri- eller bin.base64-typen XDR (beroende på om det binära base64-alternativet anges i frågan). Typen bin.base64 XDR är användbar om du använder updategram- och bulkload-funktionerna, eftersom denna typ konverteras till SQL Server-tidsstämpeltypen. På så sätt lyckas insättningen, uppdateringen eller borttagningen.
Djupa VARIANTs används i serverbaserad formatering
Vid server-side XML-formatering används djuptyperna av en VARIANT-typ. Om du använder klient-sida XML-formatering konverteras varianterna till Unicode-strängen, och subtyperna av VARIANT används inte.
NÄSTLAD Mode vs. AUTO-läge
NÄSTLADE läget för klientsidan FOR XML liknar AUTO-läget för serversidan FOR XML, med följande undantag:
När du frågar vyer i AUTO-läge på serversidan returneras vynamnet som elementnamnet i den resulterande XML:en.
Till exempel, anta att följande vy skapas på Person.Kontakt-tabellen i AdventureWorks-databasen:
CREATE VIEW ContactView AS (SELECT ContactID as CID,
FirstName as FName,
LastName as LName
FROM Person.Contact)
Följande mall specificerar en fråga mot ContactView-vyn och specificerar även server-side XML-formatering:
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<sql:query client-side-xml="0">
SELECT *
FROM ContactView
FOR XML AUTO
</sql:query>
</ROOT>
När du kör mallen returneras följande XML. (Endast delvisa resultat visas.) Observera att elementnamnen är namnen på de vyer som förfrågan utförs mot.
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<ContactView CID="1" FName="Gustavo" LName="Achong" />
<ContactView CID="2" FName="Catherine" LName="Abel" />
...
</ROOT>
När du specificerar klient-sida XML-formatering med motsvarande NÄSTLAD läge, returneras bastabellens namn som elementnamnet/-namnen i den resulterande XML:en. Till exempel kör följande reviderade mall samma SELECT-sats, men XML-formateringen utförs på klientsidan (det vill säga, klientsidans XML är satt till true i mallen):
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<sql:query client-side-xml="1">
SELECT *
FROM ContactView
FOR XML NESTED
</sql:query>
</ROOT>
Att köra denna mall ger följande XML. Observera att elementnamnet är bastabellens namn i detta fall.
<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>
När du använder AUTO-läge på serversidan FÖR XML returneras tabellaliasen som anges i frågan som elementnamn i den resulterande XML:en.
Till exempel, betrakta denna mall:
<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>
Genom att köra mallen produceras följande XML:
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<C fname="Gustavo" lname="Achong" />
<C fname="Catherine" lname="Abel" />
...
</ROOT>
När du använder NESTED-läget i klientsidan FOR XML returneras tabellnamnen som elementnamn i den resulterande XML:en. (Tabellalias som anges i frågan används inte.) Till exempel, betrakta denna mall:
<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>
Genom att köra mallen produceras följande XML:
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<Person.Contact fname="Gustavo" lname="Achong" />
<Person.Contact fname="Catherine" lname="Abel" />
...
</ROOT>
Om du har en fråga som returnerar kolumner som dbobjekt-frågor kan du inte använda alias för dessa kolumner.
Till exempel, betrakta följande mall, som kör en förfrågan som returnerar ett personal-ID och ett 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>
Att köra denna mall returnerar fotokolumnen som en dbobject-fråga. I denna dbobjektfråga @P syftar på ett kolumnnamn som inte finns.
<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>
Om XML-formateringen görs på servern (client-side-xml="0"), kan du använda aliaset för kolumnerna som returnerar dbobject-frågor där faktiska tabell- och kolumnnamn returneras (även om du har specificerade alias). Till exempel kör följande mall en fråga, och XML-formateringen görs på servern ( klientsidan-xml-alternativet är inte specificerat och alternativet Kör på klient är inte valt för den virtuella roten). Frågan specificerar också AUTO-läge (inte klientsidans NÄSTLADE läge).
<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>
När denna mall körs returneras följande XML-dokument (observera att alias inte används i dbobject-frågan för kolumnen 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>
Klientsida vs. server-side XPath
XPath på klientsidan och XPath på serversidan fungerar likadant förutom dessa skillnader:
De datakonverteringar som tillämpas när du använder klientsidan av XPath-frågor skiljer sig från de som tillämpas när du använder server-sida XPath-frågor. Klientsidans XPath använder CAST istället för CONVERT-läge 126.
När du anger klient-sida-xml="0" (falsk) i en mall, begär du server-side XML-formatering. Därför kan du inte ange FÖR XML NÄSTLAD eftersom servern inte känner igen alternativet NÄSTLAT. Detta genererar ett fel. Du måste använda AUTO, RAW eller EXPLICIT-lägena, som servern känner igen.
När du anger klient-sida-xml="1" (sann) i en mall, begär du klient-sida XML-formatering. I detta fall kan du ange FÖR XML NÄST. Om du anger FOR XML AUTO sker XML-formateringen på serversidan även om klientsidan-xml="1" anges i mallen.
Se även
FÖR XML-säkerhetsöverväganden (SQLXML 4.0)
Klientsida XML-formatering (SQLXML 4.0)
Server-side XML-formatering (SQLXML 4.0)