Partager via


Gestion des erreurs (XQuery)

S'applique à :SQL Server

La spécification W3C permet de déclencher des erreurs de type statiquement ou dynamiquement et définit des erreurs statiques, dynamiques et de type.

Compilation et gestion des erreurs

Les erreurs de compilation sont retournées à partir d’expressions et XML DML d’instructions Xquery incorrectes de manière syntactique. La phase de compilation permet de vérifier l'exactitude des types statiques des expressions XQuery et des instructions DML, et d'utiliser des schémas XML pour les inférences de type pour le code XML typé. Des erreurs de type statique sont générées si une expression risque d'échouer lors de l'exécution suite à la violation de la cohérence des types. On trouve parmi les erreurs statiques l'ajout d'une chaîne à un entier ou encore l'interrogation d'un nœud inexistant pour des données typées.

Conformément à la norme du W3C, les erreurs d'exécution XQuery sont converties en séquences vides. Ces séquences peuvent se propager sous forme de code XML vide ou NULL au résultat de la requête, en fonction du contexte d’appel.

Une conversion explicite en type correct permet aux utilisateurs d'éviter les erreurs statiques même si les erreurs de conversion à l'exécution sont transformées en séquences vides.

Note

Analyse des erreurs générées par l’analyseur XQuery (par exemple, les erreurs de syntaxe dans le code XML référencés dans le cadre de la méthode de type de données XML, par exemple), abandonnez la transaction active, quel que soit le paramètre XACT_ABORT de la session active.

Erreurs statiques

Les erreurs statiques sont retournées à l’aide du mécanisme d’erreur Transact-SQL. Dans SQL Server, les erreurs de type XQuery sont retournées statiquement. Pour plus d’informations, consultez XQuery et Saisie statique.

Erreurs dynamiques

Dans XQuery, la plupart des erreurs dynamiques sont mappées à une séquence vide (« () »). Il existe toutefois deux exceptions : les conditions de dépassement dans les fonctions d'agrégation XQuery et les erreurs de validation XML-DML. La plupart des erreurs dynamiques sont mappées à une séquence vide. Sinon, l’exécution de requête qui tire parti des index XML peut générer des erreurs inattendues. Par conséquent, pour fournir une exécution efficace sans générer d’erreurs inattendues, SQL Server Moteur de base de données mappe les erreurs dynamiques à ().

Souvent, dans la situation où l’erreur dynamique se produit à l’intérieur d’un prédicat, ne pas déclencher l’erreur ne modifie pas la sémantique, car () est mappée à False. Toutefois, dans certains cas, le retour () au lieu d’une erreur dynamique peut entraîner des résultats inattendus. Les exemples suivants illustrent ce point.

Exemple : utilisation de la fonction avg() avec une chaîne

Dans l’exemple suivant, la fonction Avg est appelée pour calculer la moyenne des trois valeurs. L'une de ces valeurs est une chaîne. Étant donné que l’instance XML dans ce cas n’est pas typée, toutes les données qu’il contient sont de type atomique non typé. La fonction avg() convertit d’abord ces valeurs en xs :double avant de calculer la moyenne. Toutefois, la valeur, "Hello"ne peut pas être convertie en xs :double et crée une erreur dynamique. Dans ce cas, au lieu de retourner une erreur dynamique, le cast de "Hello" xs  :double provoque une séquence vide. La fonction avg() ignore cette valeur, calcule la moyenne des deux autres valeurs et retourne 150.

DECLARE @x xml
SET @x=N'<root xmlns:myNS="test">
 <a>100</a>
 <b>200</b>
 <c>Hello</c>
</root>'
SELECT @x.query('avg(//*)')

Exemple : Utilisation de la fonction non

Lorsque vous utilisez la fonction Not dans un prédicat, par exemple, /SomeNode[not(Expression)]et que l’expression provoque une erreur dynamique, une séquence vide est retournée au lieu d’une erreur. L’application de not() à la séquence vide retourne True, au lieu d’une erreur.

Exemple : conversion d’une chaîne

Dans l'exemple suivant, la chaîne littérale « NaN » est convertie au format xs:string, puis au format xs:double. Le résultat est un ensemble de lignes vide. Bien que la chaîne « NaN » ne puisse pas être castée avec succès sur xs :double, cela ne peut pas être déterminé tant que l’exécution n’est pas terminée, car la chaîne est d’abord castée en xs :string.

DECLARE @x XML
SET @x = ''
SELECT @x.query(' xs:double(xs:string("NaN")) ')
GO

Toutefois, dans cet exemple, une erreur de type statique se produit.

DECLARE @x XML
SET @x = ''
SELECT @x.query(' xs:double("NaN") ')
GO

Limitations de l’implémentation

La fonction fn :error() n’est pas prise en charge.