Teilen über


Clientseitige im Vergleich zur serverseitigen XML-Formatierung (SQLXML 4.0)

Gilt für: SQL Server Azure SQL-Datenbank Azure SQL verwaltete Instanz

In diesem Thema werden die allgemeinen Unterschiede zwischen clientseitiger und serverseitiger XML-Formatierung in SQLXML beschrieben.

Keine Unterstützung von mehreren Rowset-Abfragen bei der clientseitigen Formatierung

Abfragen, die mehrere Rowsets generieren, werden bei einer clientseitigen XML-Formatierung nicht unterstützt. Beispiel: Sie haben ein virtuelles Verzeichnis, für das eine clientseitige Formatierung angegeben wurde. Betrachten Sie diese Beispielvorlage mit zwei SELECT-Anweisungen in einem 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>  

Sie können diese Vorlage im Anwendungscode ausführen, es wird ein Fehler zurückgegeben, da die clientseitige XML-Formatierung keine Formatierung mehrerer Rowsets unterstützt. Wenn Sie die Abfragen in zwei separaten <sql:query-Blöcken> angeben, erhalten Sie die gewünschten Ergebnisse.

Unterschiedliche timestamp-Zuordnungen bei der client- und serverseitigen Formatierung

In der serverseitigen XML-Formatierung wird die Datenbankspalte des Zeitstempeltyps dem i8-XDR-Typ zugeordnet (wenn die XMLDATA-Option in der Abfrage angegeben wird).

In clientseitiger XML-Formatierung wird die Datenbankspalte des Zeitstempeltyps entweder dem URI oder dem XDR-Typ "bin.base64 " zugeordnet (je nachdem, ob die binäre Base64-Option in der Abfrage angegeben ist). Der XDR-Typ bin.base64 ist nützlich, wenn Sie die Updategramm- und Massenladefeatures verwenden, da dieser Typ in den SQL Server-Zeitstempeltyp konvertiert wird. Auf diese Art werden die Einfüge-, Update- oder Löschvorgänge erfolgreich abgeschlossen.

Bei serverseitiger Formatierung werden tiefe VARIANTs verwendet

Bei der serverseitigen XML-Formatierung werden tiefe Typen eines VARIANT-Typs verwendet. Bei der clientseitigen XML-Formatierung werden die Varianten in Unicode-Zeichenfolgen konvertiert und die Untertypen von VARIANT werden nicht verwendet.

NESTED-Modus im Vergleich zum AUTO-Modus

Der NESTED-Modus des clientseitigen FOR XML ähnelt dem AUTO-Modus des serverseitigen FOR XML. Ausnahmen:

Wenn Sie Sichten mit AUTO-Modus serverseitig abfragen, wird der Sichtname als Elementname in der resultierenden XML zurückgegeben.

Angenommen, die folgende Ansicht wird in der Tabelle "Person.Contact" in der AdventureWorksdatabase erstellt:

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

Die folgende Vorlage gibt eine Abfrage der ContactView-Sicht und die serverseitige XML-Formatierung an:

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

Wenn Sie die Vorlage ausführen, wird die folgende XML zurückgegeben. (Es werden nur Teilergebnisse angezeigt.) Beachten Sie, dass die Elementnamen die Namen der Ansichten sind, für die die Abfrage ausgeführt wird.

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

Wenn Sie die clientseitige XML-Formatierung mit dem entsprechenden NESTED-Modus angeben, werden die Basistabellennamen als Elementnamen in der resultierenden XML zurückgegeben. Die folgende überarbeitete Vorlage führt z. B. dieselbe SELECT-Anweisung aus, aber die XML-Formatierung wird auf clientseitiger Seite ausgeführt (d . r. clientseitige XML wird in der Vorlage auf "true" festgelegt):

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

Durch die Ausführung der Vorlage wird die folgende XML erstellt. Beachten Sie, dass in diesem Fall der Elementname der Basistabellenname ist.

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

Wenn Sie den AUTO-Modus des serverseitigen FOR XML verwenden, werden die in der Abfrage angegebenen Tabellenaliasse als Elementnamen in der resultierenden XML zurückgegeben.

Betrachten Sie z. B. die folgende Vorlage:

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

Durch die Ausführung der Vorlage wird die folgende XML erstellt:

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

Wenn Sie den NESTED-Modus des clientseitigen FOR XML verwenden, werden die Tabellennamen als Elementnamen in der resultierenden XML zurückgegeben. (Tabellenaliasen, die in der Abfrage angegeben sind, werden nicht verwendet.) Betrachten Sie z. B. diese Vorlage:

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

Durch die Ausführung der Vorlage wird die folgende XML erstellt:

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

Wenn eine Abfrage Spalten als dbobject-Abfragen zurückgibt, können Sie keine Aliasse für diese Spalten verwenden.

Die folgende Vorlage führt beispielsweise eine Abfrage aus, die eine Mitarbeiter-ID und ein Foto zurückgibt.

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

Wenn Sie diese Vorlage ausführen, wird die Photo-Spalte als eine dbobject-Abfrage zurückgegeben. In dieser dbobject-Abfrage verweist @P auf einen Spaltennamen, der nicht existiert.

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

Wenn die XML-Formatierung auf dem Server (clientseitiges Xml="0") erfolgt, können Sie den Alias für die Spalten verwenden, die dbobject-Abfragen zurückgeben, in denen tatsächliche Tabellen- und Spaltennamen zurückgegeben werden (auch wenn Aliase angegeben sind). Die folgende Vorlage führt z. B. eine Abfrage aus, und die XML-Formatierung erfolgt auf dem Server (die clientseitige XML-Option ist nicht angegeben, und die Option "Auf Client ausführen" ist für den virtuellen Stamm nicht ausgewählt). Die Abfrage gibt auch den AUTO-Modus an (nicht den clientseitigen NESTED-Modus).

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

Wenn diese Vorlage ausgeführt wird, wird das folgende XML-Dokument zurückgegeben (beachten Sie, dass die Aliasse nicht in der dbobject-Abfrage für die LargePhoto-Spalte verwendet werden):

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

Clientseitiger im Vergleich zu serverseitigem XPath

Clientseitiger XPath und serverseitiger XPath funktionieren gleichermaßen, weisen jedoch die folgenden Unterschiede auf:

  • Die Datenkonvertierungen, die angewendet werden, wenn Sie clientseitige XPath-Abfragen verwenden, unterscheiden sich von jenen, die angewendet werden, wenn Sie serverseitige XPath-Abfragen verwenden. Clientseitiger XPath verwendet CAST anstelle von CONVERT-Modus 126.

  • Wenn Sie clientseitiges XML="0" (false) in einer Vorlage angeben, fordern Sie serverseitige XML-Formatierung an. Sie können somit nicht FOR XML NESTED angeben, da der Server die NESTED-Option nicht erkennt. In diesem Fall wird ein Fehler generiert. Sie müssen die Modi AUTO, RAW oder EXPLICIT verwenden, die der Server erkennt.

  • Wenn Sie clientseitiges XML="1" (true) in einer Vorlage angeben, fordern Sie clientseitige XML-Formatierung an. In diesem Fall können Sie FOR XML NESTED angeben. Wenn Sie FOR XML AUTO angeben, erfolgt die XML-Formatierung auf serverseitiger Seite, obwohl clientseitiges XML="1" in der Vorlage angegeben wird.

Weitere Informationen

FOR XML-Sicherheitsüberlegungen (SQLXML 4.0)
Clientseitige XML-Formatierung (SQLXML 4.0)
Serverseitige XML-Formatierung (SQLXML 4.0)