Mise en forme XML côté client et côté serveur (SQLXML 4.0)
Cette rubrique décrit les principales différences entre la mise en forme XML côté client et côté serveur dans SQLXML.
Les requêtes générant plusieurs ensembles de lignes ne sont pas prises en charge dans la mise en forme côté client
Les requêtes qui génèrent plusieurs ensembles de lignes ne sont pas prises en charge lorsque vous utilisez la mise en forme XML côté client. Supposons par exemple que vous ayez un répertoire virtuel dans lequel une mise en forme côté client est spécifiée. Étudiez cet exemple de modèle contenant deux instructions SELECT dans un bloc <sql:query> :
<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>
Si vous exécutez ce modèle dans un code d'application, une erreur est alors retournée car la mise en forme XML côté client ne prend pas en charge la mise en forme de plusieurs ensembles de lignes. Si vous spécifiez les requêtes dans deux blocs <sql:query> distincts, vous obtenez les résultats souhaités.
timestamp est mappé différemment dans la mise en forme côté client et la mise en forme côté serveur
Dans la mise en forme XML côté serveur, la colonne de base de données de type timestamp est mappée au type XDR i8 (lorsque l'option XMLDATA est spécifiée dans la requête).
Dans la mise en forme XML côté client, la colonne de base de données de type timestamp est mappée au type XDR uri ou bin.base64 (selon que l'option BINARY BASE64 est spécifiée dans la requête). Le type XDR bin.base64 est utile si vous utilisez les fonctionnalités de code de mise à jour (updategram) et bulkload, car ce type est converti en type SQL Servertimestamp. De cette manière, l'opération insert, update ou delete réussit.
Les sous-types Deep du type VARIANT sont utilisés dans la mise en forme côté serveur
Dans la mise en forme XML côté serveur, les types Deep d'un type de données VARIANT sont utilisés. Si vous utilisez la mise en forme XML côté client, les variantes sont converties en chaîne Unicode et les sous-types de VARIANT ne sont pas utilisés.
Mode NESTED et mode AUTO
Le mode NESTED de FOR XML côté client est semblable au mode AUTO de FOR XML côté serveur, avec les exceptions suivantes :
Lorsque vous interrogez des vues à l'aide du mode AUTO côté serveur, le nom de la vue est retourné comme nom de l'élément dans le XML résultant.
Supposons par exemple que la vue suivante est créée sur la table Person.Contact dans la base de données AdventureWorks :
CREATE VIEW ContactView AS (SELECT ContactID as CID,
FirstName as FName,
LastName as LName
FROM Person.Contact)
Le modèle suivant spécifie une requête sur la vue ContactView, de même que la mise en forme XML côté serveur :
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<sql:query client-side-xml="0">
SELECT *
FROM ContactView
FOR XML AUTO
</sql:query>
</ROOT>
Lorsque vous exécutez le modèle, le XML suivant est retourné (extrait des résultats). Notez que les noms des éléments correspondent aux noms des vues sur lesquelles la requête est exécutée.
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<ContactView CID="1" FName="Gustavo" LName="Achong" />
<ContactView CID="2" FName="Catherine" LName="Abel" />
...
</ROOT>
Lorsque vous spécifiez la mise en forme XML côté client en utilisant le mode NESTED correspondant, les noms des tables de base sont retournés comme noms des éléments dans le XML résultant. Par exemple, le modèle modifié suivant exécute la même instruction SELECT, mais la mise en forme XML est appliquée côté client (autrement dit, client-side-xml a la valeur true dans le modèle) :
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<sql:query client-side-xml="1">
SELECT *
FROM ContactView
FOR XML NESTED
</sql:query>
</ROOT>
L'exécution de ce modèle génère le XML suivant. Notez que dans ce cas, le nom de l'élément correspond au nom de la table de base.
<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>
Lorsque vous utilisez le mode AUTO de FOR XML côté serveur, les alias de tables spécifiés dans la requête sont retournés en tant que noms des éléments dans le XML résultant.
Considérons par exemple le modèle suivant :
<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>
L'exécution de ce modèle génère le XML suivant :
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<C fname="Gustavo" lname="Achong" />
<C fname="Catherine" lname="Abel" />
...
</ROOT>
Lorsque vous utilisez le mode NESTED de FOR XML côté client, les noms des tables sont retournés en tant que noms des éléments dans le XML résultant. (Les alias de tables spécifiés dans la requête ne sont pas utilisés.) Considérons par exemple le modèle suivant :
<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>
L'exécution de ce modèle génère le XML suivant :
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<Person.Contact fname="Gustavo" lname="Achong" />
<Person.Contact fname="Catherine" lname="Abel" />
...
</ROOT>
Si une requête retourne des colonnes sous forme de requêtes dbobject, vous ne pouvez pas utiliser d'alias pour ces colonnes.
Considérons par exemple le modèle suivant qui exécute une requête retournant un ID d'employé et une photo.
<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>
L'exécution de ce modèle retourne la colonne Photo sous forme de requête dbobject. Dans cette requête dbobject, @P fait référence à un nom de colonne qui n'existe pas.
<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>
Si la mise en forme XML est effectuée sur le serveur (client-side-xml="0"), vous pouvez utiliser l'alias des colonnes qui retournent des requêtes dbobject dans lesquelles les noms de tables et de colonnes réels sont retournés (même si des alias sont spécifiés). Par exemple, le modèle suivant exécute une requête et la mise en forme XML est effectuée sur le serveur (l'option client-side-xml n'est pas spécifiée et l'option Run On Client n'est pas sélectionnée pour la racine virtuelle). La requête spécifie également le mode AUTO (pas le mode NESTED côté client).
<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>
Lorsque ce modèle est exécuté, le document XML suivant est retourné (notez que les alias ne sont pas utilisés dans la requête dbobject pour la colonne 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>
XPath côté client et côté serveur
XPath côté client et XPath côté serveur fonctionnement de la même manière, à quelques différences près :
Les conversions de données appliquées lorsque vous utilisez des requêtes XPath côté client sont différentes de celles qui s'appliquent lorsque vous utilisez des requêtes XPath côté serveur. Les requêtes XPath côté client utilisent CAST au lieu du mode CONVERT 126.
Lorsque vous spécifiez client-side-xml="0" (faux) dans un modèle, vous demandez la mise en forme XML côté serveur. Par conséquent, vous ne pouvez pas spécifier FOR XML NESTED car le serveur ne reconnaît pas l'option NESTED. Cela génère une erreur. Vous devez utiliser les modes AUTO, RAW ou EXPLICIT, que le serveur reconnaît.
Lorsque vous spécifiez client-side-xml="1" (vrai) dans un modèle, vous demandez la mise en forme XML côté client. Dans ce cas, vous pouvez spécifier FOR XML NESTED. Si vous spécifiez FOR XML AUTO, la mise en forme XML se produit côté serveur bien que client-side-xml="1" soit spécifié dans le modèle.