Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
In diesem Thema werden die allgemeinen Unterschiede zwischen clientseitiger und serverseitiger XML-Formatierung in SQLXML beschrieben.
Mehrere Rowsetabfragen werden in clientseitiger Formatierung nicht unterstützt
Abfragen, die mehrere Rowsets generieren, werden nicht unterstützt, wenn Sie clientseitige XML-Formatierung verwenden. Angenommen, Sie haben ein virtuelles Verzeichnis, in dem sie eine clientseitige Formatierung angegeben haben. 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 und ein Fehler wird zurückgegeben, da clientseitige XML-Formatierung die Formatierung mehrerer Rowsets nicht unterstützt. Wenn Sie die Abfragen in zwei separaten <sql:query-Blöcken> angeben, erhalten Sie die gewünschten Ergebnisse.
Zeitstempelzuordnungen in Client- und serverseitiger Formatierung unterschiedlich
In serverseitiger XML-Formatierung wird die Datenbankspalte des timestamp Typs dem i8-XDR-Typ zugeordnet (wenn die XMLDATA-Option in der Abfrage angegeben wird).
In clientseitiger XML-Formatierung ist die Datenbankspalte vom timestamp Typ entweder dem uri XDR-Typ zugeordnet bin.base64 (je nachdem, ob die binäre Base64-Option in der Abfrage angegeben ist). Der bin.base64 XDR-Typ ist nützlich, wenn Sie die Updategramm- und Massenladefeatures verwenden, da dieser Typ in den SQL Server-Typ timestamp konvertiert wird. Auf diese Weise ist der Einfüge-, Aktualisierungs- oder Löschvorgang erfolgreich.
Deep VARIANTs werden in serverseitiger Formatierung verwendet
In serverseitiger XML-Formatierung werden die tiefen Typen eines VARIANT-Typs verwendet. Wenn Sie clientseitige XML-Formatierung verwenden, werden die Varianten in Unicode-Zeichenfolge konvertiert, und die Untertypen von VARIANT werden nicht verwendet.
GESCHACHTELTER Modus im Vergleich zum AUTO-Modus
Der GESCHACHTELTE Modus des clientseitigen FOR XML-Codes ähnelt dem AUTO-Modus von serverseitigem FOR XML mit den folgenden Ausnahmen:
Wenn Sie Ansichten mithilfe des AUTO-Modus auf der Serverseite abfragen, wird der Ansichtsname als Elementname im 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 für die ContactView-Ansicht an und gibt auch 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 der folgende XML-Code 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 clientseitige XML-Formatierung mithilfe des entsprechenden NESTED-Modus angeben, werden die Basistabellennamen als Elementnamen im 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 ausführen dieser Vorlage wird der folgende XML-Code erzeugt. Beachten Sie, dass der Elementname in diesem Fall 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-Codes verwenden, werden die in der Abfrage angegebenen Tabellenaliasen als Elementnamen im resultierenden XML-Code zurückgegeben.
Betrachten Sie z. B. diese 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 ausführen der Vorlage wird der folgende XML-Code erzeugt:
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<C fname="Gustavo" lname="Achong" />
<C fname="Catherine" lname="Abel" />
...
</ROOT>
Wenn Sie den GESCHACHTELTEN Modus des clientseitigen FOR XML-Codes verwenden, werden die Tabellennamen als Elementnamen im resultierenden XML-Code 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 ausführen der Vorlage wird der folgende XML-Code erzeugt:
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<Person.Contact fname="Gustavo" lname="Achong" />
<Person.Contact fname="Catherine" lname="Abel" />
...
</ROOT>
Wenn Sie eine Abfrage haben, die Spalten als dbobject-Abfragen zurückgibt, können Sie keine Aliase für diese Spalten verwenden.
Betrachten Sie beispielsweise die folgende Vorlage, die eine Abfrage ausführt, 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 Spalte "Foto" als dbobject-Abfrage zurückgegeben. In dieser dbobject-Abfrage bezieht sich auf einen Spaltennamen, @P der nicht vorhanden ist.
<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 GESCHACHTELTEN 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 Aliase in der Dbobject-Abfrage für die Spalte "LargePhoto" nicht 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>
Clientseitige gegenüber serverseitigem XPath
Clientseitige XPath und serverseitige XPath funktionieren mit Ausnahme dieser Unterschiede:
Die Datenkonvertierungen, die bei Verwendung clientseitiger XPath-Abfragen angewendet werden, unterscheiden sich von denen, die bei Verwendung serverseitiger XPath-Abfragen angewendet werden. Clientseitige XPath verwendet CAST anstelle des CONVERT-Modus 126.
Wenn Sie clientseitiges XML="0" (false) in einer Vorlage angeben, fordern Sie serverseitige XML-Formatierung an. Daher können Sie FÜR XML NESTED nicht angeben, da der Server die OPTION "GESCHACHTELT" nicht erkennt. Dadurch 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.
Siehe auch
Überlegungen zur XML-Sicherheit (SQLXML 4.0)
Clientseitige XML-Formatierung (SQLXML 4.0)
Serverseitige XML-Formatierung (SQLXML 4.0)