Partager via


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 :

Cette rubrique décrit également les éléments suivants :

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 :

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