Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Cette rubrique décrit les différences générales entre la mise en forme XML côté client et côté serveur dans SQLXML.
Plusieurs requêtes d’ensemble de lignes non 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. Par exemple, supposons que vous disposez d’un répertoire virtuel dans lequel vous avez spécifié une mise en forme côté client. Considérez cet exemple de modèle, qui a 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>
Vous pouvez exécuter ce modèle dans le code de l’application et une erreur est 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 obtiendrez les résultats souhaités.
timestamp Mappe différemment dans la mise en forme côté client et côté serveur
Dans la mise en forme XML côté serveur, la colonne de base de données de timestamp type 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 timestamp type est mappée au uri type XDR ou au bin.base64 type XDR (selon que l’option binaire base64 est spécifiée dans la requête). Le bin.base64 type XDR est utile si vous utilisez le code de mise à jour et les fonctionnalités de chargement en bloc, car ce type est converti en type SQL Server timestamp . Ainsi, l’opération d’insertion, de mise à jour ou de suppression réussit.
Les VARIANTs profonds sont utilisés dans la mise en forme côté serveur
Dans la mise en forme XML côté serveur, les types profonds d’un type 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 IMBRIQUÉ par rapport au mode AUTO
Le mode NESTED du code FOR XML côté client est similaire 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é en tant que nom d’élément dans le code XML résultant.
Par exemple, supposons que la vue suivante est créée sur la table Person.Contact dans AdventureWorksdatabase :
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 et spécifie également 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 code XML suivant est retourné. (Seuls les résultats partiels sont affichés.) Notez que les noms d’éléments sont les 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 une mise en forme XML côté client à l’aide du mode NESTED correspondant, les noms de table de base sont retournés en tant que nom d’élément dans le code XML résultant. Par exemple, le modèle révisé suivant exécute la même instruction SELECT, mais la mise en forme XML est effectuée côté client (autrement dit, le code xml côté client est défini sur 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 produit le code XML suivant. Notez que le nom de l’élément est le nom de la table de base dans ce cas.
<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 du code FOR XML côté serveur, les alias de table spécifiés dans la requête sont retournés en tant que noms d’éléments dans le code XML résultant.
Par exemple, considérez ce modèle :
<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 du modèle produit le code 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 du for XML côté client, les noms de tables sont retournés en tant que noms d’éléments dans le code XML résultant. (Les alias de table spécifiés dans la requête ne sont pas utilisés.) Par exemple, considérez ce modèle :
<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 du modèle produit le code 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 vous avez une requête qui retourne des colonnes en tant que requêtes dbobject, vous ne pouvez pas utiliser d’alias pour ces colonnes.
Par exemple, considérez le modèle suivant, qui exécute une requête qui retourne 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 en tant que 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 pour les colonnes qui retournent des requêtes dbobject dans lesquelles les noms réels de table et de colonne sont retournés (même si vous avez des alias 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 xml côté client n’est pas spécifiée et l’option Exécuter sur le client n’est pas sélectionnée pour la racine virtuelle). La requête spécifie également le mode AUTO (et non 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>
Côté client et XPath côté serveur
XPath côté client et XPath côté serveur fonctionnent de la même façon, à l’exception de ces différences :
Les conversions de données appliquées lorsque vous utilisez des requêtes XPath côté client sont différentes de celles appliquées lorsque vous utilisez des requêtes XPath côté serveur. XPath côté client utilise CAST au lieu du mode CONVERT 126.
Lorsque vous spécifiez client-side-xml="0 » (false) dans un modèle, vous demandez une 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 » (true) dans un modèle, vous demandez une 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ée dans le modèle.
Voir aussi
Considérations relatives à la sécurité FOR XML (SQLXML 4.0)
Mise en forme XML côté client (SQLXML 4.0)
Mise en forme XML côté serveur (SQLXML 4.0)