Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Correction de Msg 529 "La conversion explicite du type de données int en xml n'est pas autorisée" dans SQL Server

Si vous obtenez l'erreur SQL Server Msg 529 qui lit quelque chose comme La conversion explicite du type de données int en xml n'est pas autorisée , c'est probablement parce que vous essayez d'effectuer une conversion de type de données qui n'est pas autorisée.

SQL Server n'autorise pas certaines conversions. Si vous essayez d'effectuer une telle conversion, vous obtiendrez cette erreur.

Exemple d'erreur

Voici un exemple de code qui génère l'erreur :

SELECT CAST(10 AS xml);

Résultat :

Msg 529, Level 16, State 2, Line 1
Explicit conversion from data type int to xml is not allowed.

Ici, nous avons essayé de convertir le nombre 10 en xml saisir.

SQL Server n'autorise pas une telle conversion et a donc renvoyé une erreur.

Nous obtenons la même erreur si nous essayons de convertir cette valeur en une date saisissez :

SELECT CAST(10 AS date);

Résultat :

Msg 529, Level 16, State 2, Line 1
Explicit conversion from data type int to date is not allowed.

Vous pourriez supposer que nous pourrions nous débarrasser de l'erreur en utilisant le TRY_CAST() fonction à la place. Mais cette hypothèse serait incorrecte :

SELECT TRY_CAST(10 AS xml);

Résultat :

Msg 529, Level 16, State 2, Line 1
Explicit conversion from data type int to xml is not allowed.

Bien que le TRY_CAST() la fonction peut normalement être utilisée pour retourner NULL au lieu d'une erreur, cela ne s'applique pas à cette erreur particulière.

Lorsqu'une conversion échoue car la conversion n'est pas autorisée, alors même TRY_CAST() (et TRY_CONVERT() ) renverra une erreur.

Solution

Pour résoudre ce problème, vous devez modifier soit le type d'origine, soit le type de destination (ou les deux).

Si vous dépassez une colonne, vérifiez que vous avez la bonne colonne. Idem si vous transmettez une variable - vérifiez qu'il s'agit de la bonne variable.

Par exemple, la conversion suivante réussit :

SELECT CAST('{a:10}' AS xml);

Résultat :

{a:10}

Et ce qui suit réussit également :

SELECT CAST(10 AS char(2));

Résultat :

10

En fonction de la valeur réelle, vous pouvez essayer de convertir la valeur d'origine en un type accepté.

Par exemple, nous pourrions remplacer notre code source d'erreur XML d'origine par le code suivant ne produisant pas d'erreur :

SELECT CAST(CAST(10 AS varchar) AS xml);

Résultat :

10

Dans ce cas, l'opération n'a pas validé que le résultat est un document XML valide. Il a simplement converti la valeur d'origine en xml saisir.

Cependant, cela peut ne pas toujours fonctionner, selon la valeur que vous essayez de convertir. Par exemple, notre exemple de date produit toujours une erreur (bien qu'une erreur différente) :

SELECT CAST(CAST(10 AS varchar) AS date);

Résultat :

Msg 241, Level 16, State 1, Line 1
Conversion failed when converting date and/or time from character string.

Dans ce cas, nous obtenons l'erreur Msg 241, qui est une erreur différente. Dans ce cas, l'erreur n'est pas due au refus de la conversion. Cela est dû à la valeur réelle qui cause des problèmes. Dans notre cas, SQL Server ne peut pas convertir le nombre 10 en une date valide. Nous aurions besoin de remplacer la valeur d'entrée par une valeur plus significative qui représente une date valide.