Share via


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

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. Erwägen 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.Person FOR XML Nested; 
     SELECT LastName FROM Person.Person 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

Bei der serverseitigen XML-Formatierung wird die Datenbankspalte des timestamp-Typs dem i8 XDR-Typ zugeordnet (wenn die XMLDATA-Option in der Abfrage angegeben wurde).

Bei der clientseitigen XML-Formatierung wird die Datenbankspalte des timestamp-Typs entweder dem uri- oder dem bin.base64 XDR-Typ zugeordnet. (Dies ist davon abhängig, ob die Binär-base64-Option in der Abfrage angegeben wurde.) Der bin.base64 XDR-Typ ist vor allem dann nützlich, wenn Sie die updategram- und bulkload-Funktionen verwenden, da dieser Typ in den SQL Servertimestamp-Typ konvertiert wird. Auf diese Art werden die Einfüge-, Aktualisierungs- 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.

Beispiel: Die folgende Sicht wird für die Person.Person-Tabelle in der AdventureWorks2008R2-Datenbank erstellt:

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

Die folgende Vorlage gibt eine Abfrage für die 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 partielle Ergebnisse angezeigt.) Beachten Sie, dass die Elementnamen die Namen der Sichten 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 beispielsweise die gleiche SELECT-Anweisung aus, die XML-Formatierung wird jedoch clientseitig durchgeführt (d. h. client-side-xml wird in der Vorlage auf "true" gesetzt):

<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.Person CID="1" FName="Gustavo" LName="Achong" /> 
  <Person.Person 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.&nbsp;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.Person AS 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. (Tabellenaliasse, die in der Abfrage angegeben werden, werden nicht verwendet.) Betrachten Sie z.&nbsp;B. die folgende 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.Person 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.Person fname="Gustavo" lname="Achong" /> 
  <Person.Person 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=&apos;5&apos;]/@P</LargePhoto>
  </Production.ProductPhoto>
</ROOT>

Wenn die XML-Formatierung auf dem Server durchgeführt wird (client-side-xml="0"), können Sie den Alias für die Spalten, die dbobject-Abfragen zurückgeben, verwenden, in denen tatsächliche Tabellen- und Spaltennamen zurückgegeben werden (selbst wenn Sie Aliasse angegeben haben). Die folgende Vorlage führt beispielsweise eine Abfrage aus, und die XML-Formatierung wird auf dem Server durchgeführt (die Option client-side-xml wird nicht angegeben und die Option Ausführen auf Client ist nicht für das virtuelle Root-Verzeichnis 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=&apos;5&apos;]/@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 client-side-xml="0" (false) in einer Vorlage angeben, fordern Sie eine 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 client-side-xml="1" (true) in einer Vorlage angeben, fordern Sie eine clientseitige XML-Formatierung an. In diesem Fall können Sie FOR XML NESTED angeben. Wenn Sie FOR XML AUTO angeben, wird die XML-Formatierung serverseitig durchgeführt, obgleich client-side-xml="1" in der Vorlage angegeben wurde.