sql >> Databasteknik >  >> RDS >> Sqlserver

Fix Msg 529 "Explicit konvertering från datatyp int till xml är inte tillåten" i SQL Server

Om du får SQL Server-fel Msg 529 som lyder något som Explicit konvertering från datatyp int till xml är inte tillåten , det beror förmodligen på att du försöker utföra en datatypskonvertering som inte är tillåten.

SQL Server tillåter inte vissa konverteringar. Om du försöker utföra en sådan konvertering får du detta felmeddelande.

Exempel på fel

Här är ett exempel på kod som ger felet:

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.

Här försökte vi konvertera siffran 10 till xml typ.

SQL Server tillåter inte en sådan konvertering och därför returnerade den ett fel.

Vi får samma fel om vi försöker konvertera det värdet till ett date typ:

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 anta att vi skulle kunna bli av med felet genom att använda TRY_CAST() funktion istället. Men det antagandet skulle vara felaktigt:

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.

Även om TRY_CAST() funktionen kan normalt användas för att returnera NULL istället för ett fel, gäller det inte för detta specifika fel.

När en konvertering misslyckas på grund av att konverteringen inte är tillåten, då även TRY_CAST() (och TRY_CONVERT() ) returnerar ett fel.

Lösning

För att åtgärda detta måste du ändra antingen originaltypen eller destinationstypen (eller båda).

Om du klarar en kolumn, kontrollera att du har rätt kolumn. Samma sak om du skickar en variabel – kontrollera att det är rätt variabel.

Till exempel lyckas följande konvertering:

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

Resultat:

{a:10}

Och följande lyckas också:

SELECT CAST(10 AS char(2));

Resultat:

10

Beroende på det faktiska värdet kan du försöka konvertera det ursprungliga värdet till en godkänd typ.

Till exempel kan vi ändra vår ursprungliga XML-felproducerande kod till följande icke-felproducerande kod:

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

Resultat:

10

I det här fallet validerade operationen inte att resultatet är ett giltigt XML-dokument. Det konverterade helt enkelt det ursprungliga värdet till xml typ.

Men det kanske inte alltid fungerar, beroende på värdet du försöker konvertera. Till exempel ger vårt datumexempel fortfarande ett fel (om än ett annat fel):

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 det här fallet får vi felmeddelande 241, vilket är ett annat fel. I det här fallet beror felet inte på att konverteringen inte tillåts. Det beror på att det faktiska värdet orsakar problem. I vårt fall kan SQL Server inte konvertera siffran 10 till ett giltigt datum. Vi skulle behöva ändra inmatningsvärdet till ett mer meningsfullt värde som representerar ett giltigt datum.


  1. MySQL-serverstartfel "Servern avslutades utan att uppdatera PID-filen"

  2. MySQL:Transaktioner vs låsningstabeller

  3. Hur gör man en kolumn unik i SQL?

  4. Laravel Eloquent välj alla rader med max create_at