Hvis du får SQL Server-fejl Msg 529, der lyder noget som Eksplicit konvertering fra datatype int til xml er ikke tilladt , er det sandsynligvis fordi du forsøger at udføre en datatypekonvertering, der ikke er tilladt.
SQL Server tillader ikke visse konverteringer. Hvis du forsøger at udføre en sådan konvertering, får du denne fejl.
Eksempel på fejl
Her er et eksempel på kode, der producerer fejlen:
SELECT CAST(10 AS xml);
Resultat:
Msg 529, Level 16, State 2, Line 1 Explicit conversion from data type int to xml is not allowed.
Her forsøgte vi at konvertere tallet 10 til xml
type.
SQL Server tillader ikke en sådan konvertering, og derfor returnerede den en fejl.
Vi får den samme fejl, hvis vi forsøger at konvertere denne værdi til en date
type:
SELECT CAST(10 AS date);
Resultat:
Msg 529, Level 16, State 2, Line 1 Explicit conversion from data type int to date is not allowed.
Du kan antage, at vi kunne slippe af med fejlen ved at bruge TRY_CAST()
funktion i stedet for. Men den antagelse ville være forkert:
SELECT TRY_CAST(10 AS xml);
Resultat:
Msg 529, Level 16, State 2, Line 1 Explicit conversion from data type int to xml is not allowed.
Selvom TRY_CAST()
funktion kan normalt bruges til at returnere NULL
i stedet for en fejl, gælder det ikke for denne særlige fejl.
Når en konvertering mislykkes, fordi konverteringen ikke er tilladt, så endda TRY_CAST()
(og TRY_CONVERT()
) vil returnere en fejl.
Løsning
For at løse dette skal du enten ændre originaltypen eller destinationstypen (eller begge dele).
Hvis du passerer en kolonne, skal du kontrollere, at du har den rigtige kolonne. Det samme, hvis du sender en variabel - tjek, at det er den rigtige variabel.
For eksempel lykkes følgende konvertering:
SELECT CAST('{a:10}' AS xml);
Resultat:
{a:10}
Og følgende lykkes også:
SELECT CAST(10 AS char(2));
Resultat:
10
Afhængigt af den faktiske værdi, kan du prøve at konvertere den oprindelige værdi til en accepteret type.
For eksempel kunne vi ændre vores originale XML-fejlproducerende kode til følgende ikke-fejlproducerende kode:
SELECT CAST(CAST(10 AS varchar) AS xml);
Resultat:
10
I dette tilfælde validerede handlingen ikke, at resultatet er et gyldigt XML-dokument. Det konverterede simpelthen den oprindelige værdi til xml
type.
Dette virker dog muligvis ikke altid, afhængigt af den værdi, du forsøger at konvertere. For eksempel producerer vores datoeksempel stadig en fejl (omend en anden fejl):
SELECT CAST(CAST(10 AS varchar) AS date);
Resultat:
Msg 241, Level 16, State 1, Line 1 Conversion failed when converting date and/or time from character string.
I dette tilfælde får vi fejlmeddelelse 241, som er en anden fejl. I dette tilfælde skyldes fejlen ikke, at konverteringen er blevet afvist. Det er på grund af den faktiske værdi, der forårsager problemer. I vores tilfælde kan SQL Server ikke konvertere tallet 10 til en gyldig dato. Vi bliver nødt til at ændre inputværdien til en mere meningsfuld værdi, der repræsenterer en gyldig dato.