Système de types (XQuery)
S'applique à : SQL Server
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 http://www.w3.org/2001/XMLSchema de noms.
Types définis dans l’espace http://www.w3.org/2004/07/xpath-datatypes de noms.
Cette rubrique décrit également les éléments suivants :
La valeur typée par rapport à la valeur de chaîne d'un nœud.
Fonction de données (XQuery) et fonction de chaîne (XQuery).
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 Expression Context and Query Evaluation (XQuery). Par exemple, la requête suivante est spécifiée par rapport à 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.
Types définis dans l'espace de noms des types de données XPath
Les types définis dans l’espace http://www.w3.org/2004/07/xpath-datatypes de noms ont un préfixe prédéfini de 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 type XQuery et sont utilisés pour XQuery et la saisie 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 xml non typé, le type statique et dynamique des nœuds d’élément est xdt :untyped, et le type de valeurs d’attribut est xdt :untypedAtomic. Le résultat d’une méthode query() génère un XML non typé. Cela signifie que les nœuds XML sont retournés en tant que 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()')
Remarque
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 de données (XQuery) retourne la valeur typée d’un nœud.
La fonction de chaîne (XQuery) retourne la valeur de chaîne du nœud.
Dans la collection de schémas XML suivante, 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 data()
fonction récupère les valeurs typées des LaborHours
attributs de tous les <Location
> éléments d’un modèle de produit. Selon le schéma XML associé à la Instruction
colonne, 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.
Remarque
L’utilisation explicite de la fonction data() dans cet exemple est destinée uniquement à l’illustration. S’il n’est pas spécifié, sum() applique implicitement la fonction data() pour extraire les valeurs typées des nœuds.
Voir aussi
Modèles et autorisations du générateur de SQL Server Profiler
Concepts de base de XQuery