Utilisation du mode RAW
Le mode RAW transforme chaque ligne de l'ensemble de résultats de la requête en un élément XML contenant l'identificateur générique <row> ou le nom d'élément éventuellement fourni. Par défaut, chaque valeur de colonne dans l'ensemble de lignes qui n'est pas NULL est mappée à un attribut de l'élément <row>. Si la directive ELEMENTS est ajoutée à la clause FOR XML, chaque valeur de colonne est mappée à un sous-élément de l'élément <row>. Avec la directive ELEMENTS, vous pouvez éventuellement spécifier l'option XSINIL pour mapper les valeurs de colonnes NULL dans l'ensemble de résultats à un élément qui possède l'attribut xsi:nil="
true"
.
L'option BINARY BASE64 doit être spécifiée dans la clause FOR XML pour retourner les données binaires dans un format codé en base 64. En mode RAW, la récupération de données binaires sans spécification de l'option BINARY BASE64 génère une erreur.
Vous pouvez demander un schéma pour les données XML résultantes. Spécifier l'option XMLDATA permet de retourner un schéma XDR en ligne. Spécifier l'option XMLSCHEMA permet de retourner un schéma XSD en ligne. Le schéma apparaît au début des données. Dans le résultat, la référence à l'espace de noms du schéma est répétée pour chaque élément de niveau supérieur.
Exemples
Les requêtes des exemples ci-dessous montrent comment utiliser le mode FOR XML RAW avec différentes options. Un grand nombre de ces requêtes sont spécifiées sur les documents XML d'instructions de fabrication de vélos, stockés dans la colonne Instructions de la table ProductModel. Pour plus d'informations sur les instructions XML, consultez Représentation du type de données xml dans la base de données AdventureWorks.
A. Récupération des informations de modèle de produit au format XML
La requête suivante retourne des informations sur le modèle d'un produit. Le mode RAW
est spécifié dans la clause FOR XML
.
USE AdventureWorks;
GO
SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID=122 or ProductModelID=119
FOR XML RAW;
GO
Voici le résultat partiel :
<row ProductModelID="122" Name="All-Purpose Bike Stand" />
<row ProductModelID="119" Name="Bike Wash" />
Vous pouvez récupérer des données XML centrées sur les éléments en spécifiant la directive ELEMENTS
.
USE AdventureWorks;
GO
SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID=122 or ProductModelID=119
FOR XML RAW, ELEMENTS;
GO
Voici le résultat obtenu :
<row>
<ProductModelID>122</ProductModelID>
<Name>All-Purpose Bike Stand</Name>
</row>
<row>
<ProductModelID>119</ProductModelID>
<Name>Bike Wash</Name>
</row>
Vous pouvez éventuellement spécifier la directive TYPE
pour récupérer les résultats en tant que type xml. La directive TYPE
ne modifie pas le contenu des résultats. Seul le type de données des résultats est affecté.
USE AdventureWorks;
GO
SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID=122 or ProductModelID=119
FOR XML RAW, TYPE ;
GO
B. Spécification de XSINIL avec la directive ELEMENTS pour générer des éléments pour les valeurs de colonnes NULL
La requête suivante spécifie la directive ELEMENTS
pour générer des données XML centrées sur les éléments à partir du résultat de la requête.
USE AdventureWorks;
GO
SELECT ProductID, Name, Color
FROM Production.Product
FOR XML RAW, ELEMENTS;
GO
Le résultat partiel est le suivant.
<row>
<ProductID>1</ProductID>
<Name>Adjustable Race</Name>
</row>
...
<row>
<ProductID>317</ProductID>
<Name>LL Crankarm</Name>
<Color>Black</Color>
</row>
Comme la colonne Color
possède des valeurs NULL pour certains produits, les données XML résultantes ne génèrent pas l'élément <Color
> correspondant. En ajoutant la directive XSINIL
à ELEMENTS
, vous pouvez générer l'élément <Color
> même pour les valeurs de couleurs NULL dans l'ensemble de résultats.
USE AdventureWorks;
GO
SELECT ProductID, Name, Color
FROM Production.Product
FOR XML RAW, ELEMENTS XSINIL
Voici le résultat partiel :
<row xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<ProductID>1</ProductID>
<Name>Adjustable Race</Name>
<Color xsi:nil="true" />
</row>
...
<row>
<ProductID>317</ProductID>
<Name>LL Crankarm</Name>
<Color>Black</Color>
</row>
C. Demande de schémas pour le résultat à l'aide des options XMLDATA et XMLSCHEMA
La requête suivante retourne le schéma XML-DATA qui décrit la structure du document.
USE AdventureWorks;
GO
SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID=122 or ProductModelID=119
FOR XML RAW, XMLDATA
GO
Voici le résultat obtenu :
<Schema name="Schema1" xmlns="urn:schemas-microsoft-com:xml-data"
xmlns:dt="urn:schemas-microsoft-com:datatypes">
<ElementType name="row" content="empty" model="closed">
<AttributeType name="ProductModelID" dt:type="i4" />
<AttributeType name="Name" dt:type="string" />
<attribute type="ProductModelID" />
<attribute type="Name" />
</ElementType>
</Schema>
<row xmlns="x-schema:#Schema1" ProductModelID="122" Name="All-Purpose Bike Stand" />
<row xmlns="x-schema:#Schema1" ProductModelID="119" Name="Bike Wash" />
Remarque : |
---|
<Schema > est déclaré en tant qu'espace de noms. Pour éviter les conflits d'espaces de noms lorsque plusieurs schémas XML-Data sont interrogés dans des requêtes FOR XML différentes, l'identificateur d'espace de noms, Schema1 dans cet exemple, est modifié à chaque exécution de requête. L'identificateur d'espace de noms est composé de Scheman, où n est un entier. |
En spécifiant l'option XMLSCHEMA
, vous pouvez demander le schéma XSD pour le résultat.
USE AdventureWorks;
GO
SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID=122 or ProductModelID=119
FOR XML RAW, XMLSCHEMA
GO
Voici le résultat obtenu :
<xsd:schema targetNamespace="urn:schemas-microsoft-com:sql:SqlRowSet1" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sqltypes="https://schemas.microsoft.com/sqlserver/2004/sqltypes" elementFormDefault="qualified">
<xsd:import namespace="https://schemas.microsoft.com/sqlserver/2004/sqltypes" schemaLocation="https://schemas.microsoft.com/sqlserver/2004/sqltypes/sqltypes.xsd" />
<xsd:element name="row">
<xsd:complexType>
<xsd:attribute name="ProductModelID" type="sqltypes:int" use="required" />
<xsd:attribute name="Name" use="required">
<xsd:simpleType sqltypes:sqlTypeAlias="[AdventureWorks].[dbo].[Name]">
<xsd:restriction base="sqltypes:nvarchar" sqltypes:localeId="1033" sqltypes:sqlCompareOptions="IgnoreCase IgnoreKanaType IgnoreWidth" sqltypes:sqlSortId="52">
<xsd:maxLength value="50" />
</xsd:restriction>
</xsd:simpleType>
</xsd:attribute>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<row xmlns="urn:schemas-microsoft-com:sql:SqlRowSet1" ProductModelID="122" Name="All-Purpose Bike Stand" />
<row xmlns="urn:schemas-microsoft-com:sql:SqlRowSet1" ProductModelID="119" Name="Bike Wash" />
Vous pouvez spécifier l'URI d'espace de noms cible comme argument facultatif de XMLSCHEMA dans FOR XML. Cela retourne l'espace de noms cible spécifié dans le schéma. Cet espace de noms cible reste le même chaque fois que vous exécutez la requête. Par exemple, la version modifiée ci-dessous de la requête précédente inclut l'URI d'espace de noms, 'urn:example.com'
, comme argument.
USE AdventureWorks;
GO
SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID=122 or ProductModelID=119
FOR XML RAW, XMLSCHEMA ('urn:example.com')
GO
Voici le résultat obtenu :
<xsd:schema targetNamespace="urn:example.com" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sqltypes="https://schemas.microsoft.com/sqlserver/2004/sqltypes" elementFormDefault="qualified">
<xsd:import namespace="https://schemas.microsoft.com/sqlserver/2004/sqltypes" schemaLocation="https://schemas.microsoft.com/sqlserver/2004/sqltypes/sqltypes.xsd" />
<xsd:element name="row">
<xsd:complexType>
<xsd:attribute name="ProductModelID" type="sqltypes:int" use="required" />
<xsd:attribute name="Name" use="required">
<xsd:simpleType sqltypes:sqlTypeAlias="[AdventureWorks].[dbo].[Name]">
<xsd:restriction base="sqltypes:nvarchar" sqltypes:localeId="1033" sqltypes:sqlCompareOptions="IgnoreCase IgnoreKanaType IgnoreWidth" sqltypes:sqlSortId="52">
<xsd:maxLength value="50" />
</xsd:restriction>
</xsd:simpleType>
</xsd:attribute>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<row xmlns="urn:example.com" ProductModelID="122" Name="All-Purpose Bike Stand" />
<row xmlns="urn:example.com" ProductModelID="119" Name="Bike Wash" />
D. Récupération de données binaires
La requête ci-dessous retourne la photo du produit stockée dans une colonne de type varbinary(max). L'option BINARY BASE64
est spécifiée dans la requête pour retourner les données binaires au format codé en base64.
USE AdventureWorks
GO
SELECT ProductPhotoID, ThumbNailPhoto
FROM Production.ProductPhoto
WHERE ProductPhotoID=1
FOR XML RAW, BINARY BASE64 ;
GO
Voici le résultat obtenu :
<row ProductModelID="1" ThumbNailPhoto="base64 encoded binary data"/>
E. Attribution d'un nouveau nom à l'élément <row>
Pour chaque ligne de l'ensemble de résultats, le mode RAW génère un élément <row>. Vous pouvez éventuellement spécifier un autre nom pour cet élément en spécifiant un argument facultatif pour le mode RAW
, comme illustré dans cette requête. La requête retourne un élément <ProductModel
> pour chaque ligne de l'ensemble de lignes.
SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID=122
FOR XML RAW ('ProductModel'), ELEMENTS
GO
Voici l'ensemble de résultats. Étant donné que la directive ELEMENTS
est ajoutée à la requête, le résultat est centré sur les éléments.
<ProductModel>
<ProductModelID>122</ProductModelID>
<Name>All-Purpose Bike Stand</Name>
</ProductModel>
F. Spécification d'un élément racine pour les données XML générées par FOR XML
En spécifiant l'option ROOT
dans la requête FOR XML
, vous pouvez demander un élément de niveau supérieur unique pour les données XML résultantes, comme illustré dans cette requête. L'argument spécifié pour la directive ROOT
fournit le nom de l'élément racine.
USE AdventureWorks;
GO
SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID=122 or ProductModelID=119 or ProductModelID=115
FOR XML RAW, ROOT('MyRoot')
go
Voici le résultat obtenu :
<MyRoot>
<row ProductModelID="122" Name="All-Purpose Bike Stand" />
<row ProductModelID="119" Name="Bike Wash" />
<row ProductModelID="115" Name="Cable Lock" />
</MyRoot>
G. Interrogation de colonnes de type XML
La requête ci-dessous inclut des colonnes de type xml. Elle récupère l'ID de modèle de produit, le nom et les étapes de fabrication dans le premier emplacement à partir de la colonne Instructions
de type xml.
USE AdventureWorks;
GO
SELECT ProductModelID, Name,
Instructions.query('
declare namespace MI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions"
/MI:root/MI:Location[1]/MI:step
')
FROM Production.ProductModel
FOR XML RAW ('ProductModelData')
GO
Le résultat est le suivant. Notez que la table stocke les instructions de fabrication de certains modèles de produits uniquement. Les étapes de fabrication sont retournées comme sous-éléments de l'élément <ProductModelData
> dans le résultat.
<ProductModelData ProductModelID="5" Name="HL Mountain Frame" />
<ProductModelData ProductModelID="6" Name="HL Road Frame" />
<ProductModelData ProductModelID="7" Name="HL Touring Frame">
<MI:step> ... </MI:step>
<MI:step> ... </MI:step>
</ProductModelData>
Si la requête spécifie un nom de colonne pour les données XML retournées par la requête XQuery, comme spécifié dans l'instruction SELECT
ci-dessous, les étapes de fabrication sont incluses dans l'élément qui possède le nom spécifié.
USE AdventureWorks;
GO
SELECT ProductModelID, Name,
Instructions.query('
declare namespace MI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions"
/MI:root/MI:Location[1]/MI:step
') as ManuSteps
FROM Production.ProductModel
FOR XML RAW ('ProductModelData')
go
Voici le résultat obtenu :
<ProductModelData ProductModelID="5" Name="HL Mountain Frame" />
<ProductModelData ProductModelID="6" Name="HL Road Frame" />
<ProductModelData ProductModelID="7" Name="HL Touring Frame">
<ManuSteps>
<MI:step ... </MI:step>
<MI:step ... </MI:step>
</ManuSteps>
</ProductModelData>
La requête suivante spécifie la directive ELEMENTS
. Par conséquent, le résultat retourné est centré sur les éléments. L'option XSINIL
spécifiée avec la directive ELEMENTS
retourne les éléments <ManuSteps
>, même si la colonne correspondante dans l'ensemble de lignes est NULL.
USE AdventureWorks;
GO
SELECT ProductModelID, Name,
Instructions.query('
declare namespace MI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions"
/MI:root/MI:Location[1]/MI:step
') as ManuSteps
FROM Production.ProductModel
FOR XML RAW ('ProductModelData'), root('MyRoot'), ELEMENTS XSINIL
go
Voici le résultat obtenu :
<MyRoot xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
...
<ProductModelData>
<ProductModelID>6</ProductModelID>
<Name>HL Road Frame</Name>
<ManuSteps xsi:nil="true" />
</ProductModelData>
<ProductModelData>
<ProductModelID>7</ProductModelID>
<Name>HL Touring Frame</Name>
<ManuSteps>
<MI:step ... </MI:step>
<MI:step ...</MI:step>
...
</ManuSteps>
</ProductModelData>
</MyRoot>
H. Ajout d'espaces de noms à l'aide de WITH XMLNAMESPACES
Pour obtenir des exemples, consultez Ajout d'espaces de noms à l'aide de WITH XMLNAMESPACES.
Voir aussi
Référence
Utilisation du mode AUTO
Utilisation du mode EXPLICIT
Construction de code XML à l'aide de FOR XML
Concepts
Ajout d'espaces de noms à l'aide de WITH XMLNAMESPACES
Utilisation du mode PATH