Partager via


Conversions de type de données et annotation sql:datatype (SQLXML 4.0)

S’applique à :SQL ServerAzure SQL Database

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.

En plus de spécifier un type XSD dans un schéma, vous pouvez également spécifier un type de données Microsoft SQL Server à l’aide de 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 mappé à une colonne. Xsd:type affecte le document retourné à partir du serveur, ainsi que la requête XPath 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é lorsqu’il traite la requête. Pour plus d’informations sur la façon dont XPath utilise xsd:type, consultez Mappage de types de données XSD à des 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 de chaîne. Certains types de données requièrent des conversions supplémentaires. Le tableau suivant répertorie les conversions utilisées pour différentes valeurs xsd:type .

Type de données XSD Conversion SQL Server
Boolean CONVERT(bit, COLUMN)
Date LEFT(CONVERT(nvarchar(4000), COLUMN, 126), 10)
Décimal CONVERT(money, COLUMN)
id/idref/idrefs id-prefix + CONVERT(nvarchar(4000), COLUMN, 126)
nmtoken/nmtokens id-prefix + CONVERT(nvarchar(4000), COLUMN, 126)
Temps SUBSTRING(CONVERT(nvarchar(4000), COLUMN, 126), 1+CHARINDEX(N'T', CONVERT(nvarchar(4000), COLUMN, 126)), 24)
Tous les 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 à l’aide de xsd:type, soit parce que la conversion n’est pas possible (par exemple, la conversion de « XYZ » en type de données décimal) ou parce que la valeur dépasse la plage de ce type de données (par exemple, -100000 convertie en type XSD UnsignedShort). Les conversions de types incompatibles peuvent entraîner des documents XML non valides ou des erreurs de SQL Server.

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

Le tableau suivant montre un mappage évident des types de données SQL Server aux types de données XSD. Si vous connaissez le type SQL Server, cette table 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 est utilisée pour spécifier le type de données SQL Server ; cette annotation doit être spécifiée lorsque :

  • Vous chargez en bloc dans une colonne dateTime SQL Server à partir d’un type dateTime, date ou heure XSD. Dans ce cas, vous devez identifier le type de données SQL Server colonne à l’aide de sql:datatype="dateTime ». Cette règle s'applique également aux codes de mise à jour.

  • Vous chargez en bloc dans une colonne de SQL Server type uniqueidentifier 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 (binaire, 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 généralement recommandé de spécifier sql:datatype dans le schéma.

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 d’exemples SQLXML.

R. Spécification de xsd:type

Cet exemple montre comment un type de date XSD spécifié à l’aide de 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 AdventureWorks.

<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 de temps 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 s’affiche.

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="2001-07-01"   
         DueDate="2001-07-13T00:00:00"   
         ShipDate="00:00:00" />   
  <Order SalesOrderID="43660"   
         CustomerID="117"   
         OrderDate="2001-07-01"   
         DueDate="2001-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 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 de 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.