Forçages de type de données et annotation sql:datatype (SQLXML 4.0)

Dans un schéma XSD, l'attribut xsd:type spécifie le type de données XSD d'un élément ou d'un attribut. Lorsqu'un schéma XSD est utilisé pour extraire des données de la base de données, le type de données spécifié est utilisé pour formater les données.

Outre la spécification d'un type XSD dans un schéma, vous pouvez également spécifier un type de données Microsoft SQL Server en utilisant l'annotation sql:datatype. Les attributs xsd:type et sql:datatype contrôlent le mappage entre les types de données XSD et les types de données SQL Server.

Attribut xsd:type

Vous pouvez utiliser l'attribut xsd: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 xsd:type affecte le document qui est retourné à partir du serveur, de même que la requête XPath qui est exécutée. Lorsqu'une requête XPath est exécutée sur un schéma de mappage qui contient xsd:type, XPath utilise le type de données spécifié lors du traitement de la requête. Pour plus d'informations sur l'utilisation de xsd:type par XPath, consultez Mappage des types de données XSD en 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 xsd:type.

Type de données XSD

Conversion SQL Server

Booléen

CONVERT(bit, COLUMN)

Date

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

decimal

CONVERT(money, COLUMN)

id/idref/idrefs

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

nmtoken/nmtokens

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

Time

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

Autres

Aucune conversion supplémentaire

Notes

Certaines des valeurs retournées par SQL Server peuvent ne pas être compatibles avec les types de données XML spécifiés en utilisant xsd:type, soit parce que la conversion n'est pas possible (par exemple, la conversion de "XYZ" en type de données decimal), soit parce que la valeur dépasse la plage de ce type de données (par exemple, -100000 converti en type XSD UnsignedShort). Les conversions de type incompatibles peuvent générer des documents XML non valides ou des erreurs SQL Server.

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

Le tableau ci-dessous montre un mappage évident de types de données SQL Server en types de données XSD. Si vous connaissez le type SQL Server, ce tableau fournit le type XSD correspondant que vous pouvez spécifier dans le schéma XSD.

Type de données SQL Server

Type de données XSD

bigint

long

binary

base64Binary

bit

boolean

char

string

datetime

dateTime

decimal

decimal

float

double

image

base64Binary

int

int

money

decimal

nchar

string

ntext

string

nvarchar

string

numeric

decimal

real

float

smalldatetime

dateTime

smallint

short

smallmoney

decimal

sql_variant

string

sysname

string

text

string

timestamp

dateTime

tinyint

unsignedByte

varbinary

base64Binary

varchar

string

uniqueidentifier

string

Annotation sql:datatype

L'annotation sql:datatype permet de spécifier le type de données SQL Server ; cette annotation doit être spécifiée dans les cas suivants :

  • Vous effectuez un chargement en masse dans une colonne dateTimeSQL Server à partir d'un type XSD dateTime, date ou time. Dans ce cas, vous devez identifier le type de données de colonne SQL Server en utilisant sql:datatype="dateTime". Cette règle s'applique également aux codes de mise à jour.

  • Vous effectuez un chargement en masse dans une colonne de type SQL Serveruniqueidentifier et la valeur XSD est un GUID qui inclut des accolades ({ et }). Lorsque vous spécifiez sql:datatype="uniqueidentifier", les accolades sont supprimées de la valeur avant son insertion dans la colonne. Si sql:datatype n'est pas spécifié, la valeur est envoyée avec les accolades et l'insertion ou la mise à jour échoue.

  • Le type de données XML base64Binary est mappé à différents types de données SQL Server (binary, image ou varbinary). Pour mapper le type de données XML base64Binary à un type de données SQL Server spécifique, utilisez l'annotation sql:datatype. Cette annotation spécifie le type de données SQL Server explicite de la colonne à laquelle l'attribut est mappé. Ceci est utile lorsque les données sont stockées dans les bases de données. En spécifiant l'annotation sql:datatype, vous pouvez identifier le type de données SQL Server explicite.

Il est recommandé en général de spécifier sql:datatype dans le schéma.

Exemples

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

A. Spécification de xsd:type

Cet exemple montre comment un type XSD date qui est spécifié en utilisant l'attribut xsd:type dans le schéma affecte le document XML résultant. Le schéma fournit une vue XML de la table Sales.SalesOrderHeader dans la base de données AdventureWorks2008R2.

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
            xmlns:sql="urn:schemas-microsoft-com:mapping-schema">
  <xsd:element name="Order" sql:relation="Sales.SalesOrderHeader">
     <xsd:complexType>
       <xsd:attribute name="SalesOrderID" type="xsd:string" /> 
       <xsd:attribute name="CustomerID"   type="xsd:string" /> 
       <xsd:attribute name="OrderDate"    type="xsd:date" /> 
       <xsd:attribute name="DueDate"  /> 
       <xsd:attribute name="ShipDate"  type="xsd:time" /> 
     </xsd:complexType>
  </xsd:element>
</xsd:schema>

Dans ce schéma XSD, trois attributs retournent une valeur de date à partir de SQL Server. Lorsque le schéma :

  • spécifie xsd:type=date sur l'attribut OrderDate, la partie date de la valeur retournée par SQL Server pour l'attribut OrderDate est affichée ;

  • spécifie xsd:type=time sur l'attribut ShipDate, la partie heure de la valeur retournée par SQL Server pour l'attribut ShipDate est affichée ;

  • ne spécifie pas xsd:type sur l'attribut DueDate, la même valeur que celle retournée par SQL Server est affichée.

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 le fichier sous le nom xsdType.xml.

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

    <ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
      <sql:xpath-query mapping-schema="xsdType.xml">
        /Order
      </sql:xpath-query>
    </ROOT>
    

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

    mapping-schema="C:\SqlXmlTest\xsdType.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.

Voici le jeu de résultats partiel :

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
  <Order SalesOrderID="43659" 
         CustomerID="676" 
         OrderDate="2005-07-01" 
         DueDate="2005-07-13T00:00:00" 
         ShipDate="00:00:00" /> 
  <Order SalesOrderID="43660" 
         CustomerID="117" 
         OrderDate="2005-07-01" 
         DueDate="2005-07-13T00:00:00" 
         ShipDate="00:00:00" /> 
 ...
</ROOT>

Voici le schéma XDR équivalent :

<?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="Sales.SalesOrderHeader">
    <AttributeType name="SalesOrderID" />
    <AttributeType name="CustomerID"  />
    <AttributeType name="OrderDate" dt:type="date" />
    <AttributeType name="DueDate" />
    <AttributeType name="ShipDate" dt:type="time" />

    <attribute type="SalesOrderID" sql:field="OrderID" />
    <attribute type="CustomerID" sql:field="CustomerID" />
    <attribute type="OrderDate" sql:field="OrderDate" />
    <attribute type="DueDate" sql:field="DueDate" />
    <attribute type="ShipDate" sql:field="ShipDate" />
</ElementType>
</Schema>

B. Spécification du type de données SQL à l'aide de sql:datatype

Pour obtenir un exemple fonctionnel, consultez l'exemple G dans Exemples de chargement en masse XML (SQLXML 4.0). Dans cet exemple, une valeur GUID qui inclut "{" et "}" fait l'objet d'un chargement en masse. Le schéma dans cet exemple spécifie sql:datatype pour identifier le type de données SQL Server comme uniqueidentifier. Cet exemple montre quand sql:datatype doit être spécifié dans le schéma.