Système de types (XQuery)
XQuery est un langage fortement typé pour les types de schéma et un langage faiblement typé pour les données non typées. Les types prédéfinis de XQuery incluent les suivants :
Types intégrés de schéma XML dans l'espace de noms http://www.w3.org/2001/XMLSchema.
Types définis dans l'espace de noms http://www.w3.org/2004/07/xpath-datatypes.
Cette rubrique décrit également les éléments suivants :
La valeur typée par rapport à la valeur de chaîne d'un nœud.
Mise en correspondance du type de séquence retourné par une expression.
Types intégrés de schéma XML
Les types intégrés de schéma XML possèdent un préfixe d'espace de noms prédéfini, xs. Certains de ces types incluent xs:integer et xs:string. Tous ces types intégrés sont pris en charge. Vous pouvez utiliser ces types lorsque vous créez une collection de schémas XML.
Lorsque vous interrogez des données XML typées, le type statique et dynamique des nœuds est déterminé par la collection de schémas XML associée à la colonne ou à la variable sur laquelle porte la requête. Pour plus d'informations sur les types statiques et dynamiques, consultez Contexte des expressions et évaluation des requêtes (XQuery). Par exemple, la requête ci-dessous est spécifiée sur une colonne xml typée (Instructions). L'expression utilise instance of pour vérifier que la valeur typée de l'attribut LotSize retourné est de type xs:decimal.
SELECT Instructions.query('
DECLARE namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
data(/AWMI:root[1]/AWMI:Location[@LocationID=10][1]/@LotSize)[1] instance of xs:decimal
') AS Result
FROM Production.ProductModel
WHERE ProductModelID=7
Cette information de type est fournie par la collection de schémas XML associée à la colonne. Pour plus d'informations, consultez Représentation du type de données xml dans la base de données AdventureWorks2008R2.
Types définis dans l'espace de noms des types de données XPath
Les types définis dans l'espace de noms http://www.w3.org/2004/07/xpath-datatypes ont le préfixe prédéfini xdt. Les règles suivantes s'appliquent à ces types :
Vous ne pouvez pas utiliser ces types lorsque vous créez une collection de schémas XML. Ces types sont utilisés dans le système de types XQuery pour le XQuery et le typage statique. Vous pouvez effectuer un cast vers les types atomiques, par exemple, xdt:untypedAtomic, dans l'espace de noms xdt.
Lors de l'interrogation de données XML non typées, le type statique et dynamique des nœuds d'élément est xdt:untyped, et le type des valeurs d'attribut est xdt:untypedAtomic. Le résultat d'une méthode query() génère des données XML non typées. Cela signifie que les nœuds XML sont retournés comme xdt:untyped et xdt:untypedAtomic, respectivement.
Les types xdt:dayTimeDuration et xdt:yearMonthDuration ne sont pas pris en charge.
Dans l'exemple suivant, la requête est spécifiée sur une variable de type XML non typé. L'expression, data(/a[1]), retourne une séquence d'une valeur atomique. La fonction data() retourne la valeur typée de l'élément <a>. Comme les données XML interrogées sont non typées, le type de la valeur retournée est xdt:untypedAtomic. Par conséquent, instance of retourne true.
DECLARE @x xml
SET @x='<a>20</a>'
SELECT @x.query( 'data(/a[1]) instance of xdt:untypedAtomic' )
Au lieu de récupérer la valeur typée, l'expression (/a[1]) dans l'exemple ci-dessous retourne une séquence d'un élément, l'élément <a>. L'expression instance of utilise le test d'élément pour vérifier que la valeur retournée par l'expression est un nœud d'élément de xdt:untyped type.
DECLARE @x xml
SET @x='<a>20</a>'
-- Is this an element node whose name is "a" and type is xdt:untyped.
SELECT @x.query( '/a[1] instance of element(a, xdt:untyped?)')
-- Is this an element node of type xdt:untyped.
SELECT @x.query( '/a[1] instance of element(*, xdt:untyped?)')
-- Is this an element node?
SELECT @x.query( '/a[1] instance of element()')
Notes
Lorsque vous interrogez une instance XML typée et que l'expression de requête inclut l'axe parent, le type statique d'information des nœuds résultants n'est plus disponible. Toutefois, le type dynamique est encore associé aux nœuds.
Valeur typée par rapport à valeur de chaîne
Chaque nœud possède une valeur typée et une valeur de chaîne. Pour les données XML typées, le type de la valeur typée est fourni par la collection de schémas XML associée à la colonne ou à la variable sur laquelle porte la requête. Pour les données XML non typées, le type de la valeur typée est xdt:untypedAtomic.
Vous pouvez utiliser la fonction data() ou string() pour récupérer la valeur d'un nœud :
La Fonction data (XQuery) retourne la valeur typée d'un nœud.
La Fonction string (XQuery) retourne la valeur de chaîne du nœud.
Dans la collection de schémas XML ci-dessous, l'élément <root> du type entier est défini :
CREATE XML SCHEMA COLLECTION SC AS N'
<schema xmlns="http://www.w3.org/2001/XMLSchema">
<element name="root" type="integer"/>
</schema>'
GO
Dans l'exemple ci-dessous, l'expression commence par récupérer la valeur typée de /root[1] et lui ajoute 3.
DECLARE @x xml(SC)
SET @x='<root>5</root>'
SELECT @x.query('data(/root[1]) + 3')
Dans l'exemple suivant, l'expression échoue, car string(/root[1]) dans l'expression retourne une valeur de type de chaîne. Cette valeur est alors transmise à un opérateur arithmétique qui accepte uniquement les valeurs de type numérique comme opérandes.
-- Fails because the argument is string type (must be numeric primitive type).
DECLARE @x xml(SC)
SET @x='<root>5</root>'
SELECT @x.query('string(/root[1]) + 3')
L'exemple ci-dessous calcule le total des attributs LaborHours. La fonction data() récupère les valeurs typées des attributs LaborHours à partir de tous les éléments <Location> pour un modèle de produit. Selon le schéma XML associé à la colonne Instruction, LaborHours est de type xs:decimal.
SELECT Instructions.query('
DECLARE namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
sum(data(//AWMI:Location/@LaborHours))
') AS Result
FROM Production.ProductModel
WHERE ProductModelID=7
Cette requête retourne un résultat égal à 12,75.
Notes
L'utilisation explicite de la fonction data() dans cet exemple est fournie à titre d'illustration uniquement. Si elle n'est pas spécifiée, sum() applique implicitement la fonction data() pour extraire les valeurs typées des nœuds.
Voir aussi