sql >> Base de Datos >  >> RDS >> Sqlserver

Corrija el mensaje 529 "No se permite la conversión explícita del tipo de datos int a xml" en SQL Server

Si recibe el mensaje de error 529 de SQL Server que dice algo como No se permite la conversión explícita del tipo de datos int a xml , probablemente se deba a que está intentando realizar una conversión de tipo de datos que no está permitida.

SQL Server no permite ciertas conversiones. Si intenta realizar dicha conversión, obtendrá este error.

Ejemplo de error

Aquí hay un ejemplo de código que produce el error:

SELECT CAST(10 AS xml);

Resultado:

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

Aquí, tratamos de convertir el número 10 al xml tipo.

SQL Server no permite dicha conversión, por lo que devolvió un error.

Obtenemos el mismo error si intentamos convertir ese valor en una date tipo:

SELECT CAST(10 AS date);

Resultado:

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

Puede suponer que podemos deshacernos del error usando TRY_CAST() función en su lugar. Pero esa suposición sería incorrecta:

SELECT TRY_CAST(10 AS xml);

Resultado:

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

Aunque el TRY_CAST() la función normalmente se puede usar para devolver NULL en lugar de un error, eso no se aplica a este error en particular.

Cuando una conversión falla debido a que la conversión no está permitida, incluso TRY_CAST() (y TRY_CONVERT() ) devolverá un error.

Solución

Para solucionar esto, debe cambiar el tipo original o el tipo de destino (o ambos).

Si está pasando una columna, compruebe que tiene la columna correcta. Lo mismo si está pasando una variable:verifique que sea la variable correcta.

Por ejemplo, la siguiente conversión se realiza correctamente:

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

Resultado:

{a:10}

Y lo siguiente también tiene éxito:

SELECT CAST(10 AS char(2));

Resultado:

10

Según el valor real, puede intentar convertir el valor original a un tipo aceptado.

Por ejemplo, podríamos cambiar nuestro código XML original que produce errores al siguiente código que no produce errores:

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

Resultado:

10

En este caso, la operación no validó que el resultado sea un documento XML válido. Simplemente convirtió el valor original en el xml tipo.

Sin embargo, es posible que esto no siempre funcione, según el valor que intente convertir. Por ejemplo, nuestro ejemplo de fecha todavía produce un error (aunque, un error diferente):

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

Resultado:

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

En este caso, obtenemos el mensaje de error 241, que es un error diferente. En este caso, el error no se debe a que la conversión no esté permitida. Se debe al valor real que causa problemas. En nuestro caso, SQL Server no puede convertir el número 10 en una fecha válida. Tendríamos que cambiar el valor de entrada a un valor más significativo que represente una fecha válida.