Partager via


Forçages de type de données (schéma XDR)

Important

Cette rubrique est fournie à titre de référence pour les applications héritées. Cette fonctionnalité ne fera plus l'objet d'aucun travail de développement. Évitez de l'utiliser dans vos nouveaux travaux de développement. Utilisez à la place des schémas XSD annotés pour créer des vues XML. Pour plus d'informations, consultez Introduction aux schémas XSD annotés (SQLXML 4.0). Vous pouvez convertir des schémas XDR annotés existants en schémas XSD. Pour plus d'informations, consultez Conversion de schémas XDR annotés en schémas XSD équivalents (SQLXML 4.0).

Le type de données d'un élément ou d'un attribut peut être spécifié dans un schéma XDR. Lorsqu'un schéma XDR est utilisé pour extraire des données de la base de données, le format de données approprié est indiqué dans le résultat d'une requête. Les annotations dt:type et sql:datatype sont utilisées pour contrôler le mappage entre les types de données XDR et les types de données Microsoft SQL Server.

dt:type

Vous pouvez utiliser l'attribut dt:type pour spécifier le type de données XML d'un attribut ou d'un élément qui est mappé à une colonne. L'attribut dt:type peut être spécifié sur <AttributeType> ou <ElementType>. L'attribut dt:type affecte le document retourné par le serveur, de même que la requête XPath exécutée. Lorsqu'une requête XPath est exécutée sur un schéma de mappage contenant dt:type, XPath utilise le type de données indiqué lors du traitement de la requête. Pour plus d'informations sur l'utilisation de dt:type par XPath, consultez Types de données XPath (SQLXML 4.0).

Dans un document retourné, tous les types de données SQL Server sont convertis en représentations sous forme de chaîne. Certains types de données requièrent des conversions supplémentaires. Le tableau suivant répertorie les conversions qui sont utilisées pour différentes valeurs de dt:type.

Type de données XML

Conversion SQL Server

bit

CONVERT(bit, COLUMN)

date

LEFT(CONVERT(nvarchar(4000), COLUMN, 126), 10)

fixed.14.4

CONVERT(money, COLUMN)

id/idref/idrefs

id-prefix + CONVERT(nvarchar(4000), COLUMN, 126)

nmtoken/nmtokens

id-prefix + CONVERT(nvarchar(4000), COLUMN, 126)

time/time.tz

SUBSTRING(CONVERT(nvarchar(4000), COLUMN, 126), 1+CHARINDEX(N'T', CONVERT(nvarchar(4000), COLUMN, 126)), 24)

Autres

Aucune conversion supplémentaire

Notez que certaines valeurs SQL Server ne peuvent pas être converties en certains types de données XML, soit parce que la conversion n'est pas possible (par exemple, XYZ en type de données number), soit parce que la valeur dépasse la plage de ce type de données (par exemple, -100000 converti en ui2). Des conversions de type incompatibles peuvent conduire à des documents XML non valides ou à des erreurs SQL Server.

Mappage des types de données SQL Server en types de données XML

Le tableau suivant montre un mappage naturel des types de données SQL Server en types de données XML.

Type de données SQL Server

Type de données XML

bigint

i8

binary

bin.base64

bit

boolean

char

char

datetime

datetime

decimal

r8

float

r8

image

bin.base64

int

int

money

r8

nchar

string

ntext

string

nvarchar

string

numeric

r8

real

r4

smalldatetime

datetime

smallint

i2

smallmoney

fixed.14.4

sysname

string

text

string

timestamp

ui8

tinyint

ui1

varbinary

bin.base64

varchar

string

uniqueidentifier

uuid

sql:datatype

Le type de données XML bin.base64 est mappé à différents types de données SQL Server Microsoft (binary, image, varbinary). Pour mapper clairement le type de données XML bin.base64 à des données SQL Server spécifiques, l'annotation sql:datatype est utilisée. sql:datatype spécifie le type de données SQL Server de la colonne à laquelle l'attribut est mappé.

Ceci est utile lorsque les données sont stockées dans la base de données. En spécifiant l'annotation sql:datatype, vous pouvez identifier le type de données SQL Server explicite. L'élément de données est ensuite stocké comme le type spécifié dans sql:datatype.

L'annotation sql:datatype prend en charge tous les types de données SQL Server intégrés. (Les types de données définis par l'utilisateur ou les synonymes ne sont pas pris en charge.) La précision et l'échelle sont également prises en charge, par exemple, sql:datatype="nvarchar"and sql:datatype="nchar(10)".

Le fait de spécifier des types de données XDR et SQL Server dans le schéma de mappage peut permettre d'éliminer les conversions de données inutiles dans les requêtes SQL. Par exemple, XPath doit convertir le type de données SQL Server en type de données XDR, puis le type XDR en type XPath. Lorsque le type sql:datatype ou XDR est spécifié et que XPath détermine que la conversion est inutile, XPath ne l'effectue pas.

Dans le cas de colonnes de clé primaire, l'élimination de ces conversions peut améliorer considérablement les performances. Par exemple, la requête suivante requiert habituellement une conversion de CustomerID en chaîne (nvarchar) pour garantir des résultats corrects :

Customer[@CustomerID='ALFKI']

Si CustomerID est annoté dans le schéma avec sql:datatype="nvarchar", XPath peut éviter la conversion de données inutile.

Exemples

Pour créer des exemples fonctionnels à l'aide des exemples suivants, vous devez répondre à certaines conditions requises. Pour plus d'informations, consultez Configuration requise pour l'exécution des exemples SQLXML.

A. Spécifier dt:type sur un attribut

Dans ce schéma XDR, dt:type est spécifié sur les attributs OrdDate et ShipDate.

Pour l'attribut ReqDate, aucun type de données Xpath n'est spécifié. Par conséquent, XPath retourne les valeurs datetime SQL Server extraites de la colonne RequiredDate de la base de données.

Le type de données Xpath « date » est spécifié sur l'attribut OrdDate. XPath retourne uniquement la partie date des valeurs (et aucune heure) extraites de la colonne OrderDate.

Le type de données Xpath « time » est spécifié sur l'attribut ShipDate. XPath retourne uniquement la partie heure des valeurs (et aucune date) extraites de la colonne ShippedDate.

<?xml version="1.0" ?>
<Schema xmlns="urn:schemas-microsoft-com:xml-data"
        xmlns:dt="urn:schemas-microsoft-com:datatypes"
        xmlns:sql="urn:schemas-microsoft-com:xml-sql">

<ElementType name="Order" sql:relation="Orders">
    <AttributeType name="OID" />
    <AttributeType name="CustID"  />
    <AttributeType name="OrdDate" dt:type="date" />
    <AttributeType name="ReqDate" />
    <AttributeType name="ShipDate" dt:type="time" />

    <attribute type="OID" sql:field="OrderID" />
    <attribute type="CustID" sql:field="CustomerID" />
    <attribute type="OrdDate" sql:field="OrderDate" />
    <attribute type="ReqDate" sql:field="RequiredDate" />
    <attribute type="ShipDate" sql:field="ShippedDate" />
</ElementType>
</Schema>

Pour tester un exemple de requête XPath sur le schéma

  1. Copiez le code de schéma ci-dessus et collez-le dans un fichier texte. Enregistrez ce fichier sous le nom dataTypeXdr.xml.

  2. Copiez le modèle suivant et collez-le dans un fichier texte. Enregistrez ce fichier sous le nom dataTypeXdr.xml dans le répertoire où vous avez enregistré le fichier dataTypeXdr.xml.

    <ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
      <sql:xpath-query mapping-schema="dataTypeXdr.xml">
        /Order[@OID=43860]
      </sql:xpath-query>
    </ROOT>
    
  3. Cette URL exécute le modèle :

    http://IISServer/AdventureWorks/template/dataTypeXdrT.xml
    

Jeu de résultats obtenu :

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
  <Order OID="43860" CustID="1" OrdDate="2001-08-01" ReqDate="2001-08-13T00:00:00" ShipDate="00:00:00" /> 
</ROOT>

B. Spécifier sql:datatype sur un attribut

Dans cet exemple, sql:datatype est utilisé pour identifier le type de données SQL Server de la colonne LargePhoto.

<?xml version="1.0" ?>
<Schema xmlns="urn:schemas-microsoft-com:xml-data"
        xmlns:dt="urn:schemas-microsoft-com:datatypes"
        xmlns:sql="urn:schemas-microsoft-com:xml-sql">

<ElementType name="ProductPhoto" sql:relation="Production.ProductPhoto">
    <AttributeType name="PhotoID" />
    <AttributeType name="filename" />
    <AttributeType name="photo" sql:datatype="image"  />

    <attribute type="PhotoID" sql:field="ProductPhotoID" />
    <attribute type="filename" sql:field="LargePhotoFileName" />
    <attribute type="photo" sql:field="LargePhoto" />
</ElementType>
</Schema>

Pour tester un exemple de requête XPath sur le schéma

  1. Copiez le code de schéma ci-dessus et collez-le dans un fichier texte. Enregistrez ce fichier sous le nom DataTypeXdr2.xml.

  2. Copiez le modèle suivant et collez-le dans un fichier texte. Enregistrez ce fichier sous le nom DataTypeXdr2.xml dans le répertoire où vous avez enregistré le fichier DataTypeXdr2.xml.

    <ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
      <sql:xpath-query mapping-schema="DataTypeXdr2.xml">
        /ProductPhoto[@PhotoID="100"]
      </sql:xpath-query>
    </ROOT>
    

    Le chemin d'accès au répertoire spécifié pour le schéma de mappage (DataTypeXdr2.xml) est relatif au répertoire dans lequel le modèle est enregistré. Vous pouvez également spécifier un chemin d'accès absolu, par exemple :

    mapping-schema="C:\MyDir\DataTypeXdr2.xml"
    
  3. Créez et utilisez le script de test SQLXML 4.0 (Sqlxml4test.vbs) pour exécuter le modèle.

    Pour plus d'informations, consultez Utilisation d'ADO pour exécuter des requêtes SQLXML 4.0.

Le jeu de résultats suivant est obtenu :

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql"> 
    <ProductPhoto PhotoID="100" filename="racer02_red_large.gif" 
 photo="Binary_base64_image_returned_here"/> 
</ROOT>