Klient- vs. server-sida XML-formatering (SQLXML 4.0)

gäller för:SQL ServerAzure SQL DatabaseAzure 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)