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.
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’annotationsql:datatype
. Les xsd:type
attributs 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 xsd:type
de XPath , 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 qui sont utilisées pour différentes valeurs de 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 xsd:type
de , soit parce que la conversion n’est pas possible (par exemple, la conversion de « XYZ » en type decimal
de données) ou parce que la valeur dépasse la plage de ce type de données (par exemple, -100000 convertie en UnsignedShort
type XSD). 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
dateTime
colonne SQL Server à partir d’un type XSDdateTime
,date
outime
. Dans ce cas, vous devez identifier le type de données SQL Server colonne à l’aidesql:datatype="dateTime"
de . Cette règle s'applique également aux codes de mise à jour.Vous chargez en bloc dans une colonne de SQL Server
uniqueidentifier
type et la valeur XSD est un GUID qui comprend des accolades ({ et }). Lorsque vous spécifiezsql:datatype="uniqueidentifier"
, les accolades sont supprimées de la valeur avant son insertion dans la colonne. Sisql:datatype
n'est pas spécifié, la valeur est envoyée avec les accolades et l'insertion ou la mise à jour échoue.Le type
base64Binary
de données XML est mappé à différents types de données SQL Server (binary
,image
ouvarbinary
). Pour mapper le type de données XML à un typebase64Binary
de données SQL Server spécifique, utilisez l’annotationsql:datatype
. Cette annotation spécifie le type de données explicite SQL Server 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’annotationsql:datatype
, vous pouvez identifier le type de données explicite SQL Server.
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 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 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 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 de SQL Server. Lorsque le schéma :
xsd:type=date
Spécifie sur l’attribut OrderDate que la partie date de la valeur retournée par SQL Server pour l’attribut OrderDate s’affiche.xsd:type=time
Spécifie sur l’attribut ShipDate que la partie de temps de la valeur retournée par SQL Server pour l’attribut ShipDate s’affiche.Ne spécifie
xsd:type
pas 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
Copiez le code de schéma ci-dessus et collez-le dans un fichier texte. Enregistrez le fichier sous le nom xsdType.xml.
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"
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 de travail, consultez Exemple G dans exemples de chargement en bloc 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
d’identifier le type de données SQL Server comme uniqueidentifier
. Cet exemple montre quand sql:datatype
doit être spécifié dans le schéma.