Not
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
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)