sql >> Database >  >> RDS >> Sqlserver

Fix Msg 529 "Expliciete conversie van gegevenstype int naar xml is niet toegestaan" in SQL Server

Als u SQL Server-foutbericht 529 krijgt met de tekst Expliciete conversie van gegevenstype int naar xml is niet toegestaan , komt dit waarschijnlijk omdat u een conversie van het gegevenstype probeert uit te voeren die niet is toegestaan.

SQL Server staat bepaalde conversies niet toe. Als u een dergelijke conversie probeert uit te voeren, krijgt u deze foutmelding.

Voorbeeld van fout

Hier is een voorbeeld van code die de fout veroorzaakt:

SELECT CAST(10 AS xml);

Resultaat:

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

Hier hebben we geprobeerd het getal 10 om te zetten in de xml typ.

SQL Server staat een dergelijke conversie niet toe en daarom heeft het een fout geretourneerd.

We krijgen dezelfde foutmelding als we die waarde proberen om te zetten naar een date typ:

SELECT CAST(10 AS date);

Resultaat:

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

Je zou kunnen aannemen dat we de fout kunnen verwijderen door de TRY_CAST() . te gebruiken in plaats daarvan functioneren. Maar die veronderstelling zou onjuist zijn:

SELECT TRY_CAST(10 AS xml);

Resultaat:

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

Hoewel de TRY_CAST() functie kan normaal gesproken worden gebruikt om NULL . terug te geven in plaats van een fout, geldt dat niet voor deze specifieke fout.

Als een conversie mislukt omdat de conversie niet is toegestaan, dan is zelfs TRY_CAST() (en TRY_CONVERT() ) geeft een foutmelding.

Oplossing

Om dit op te lossen, moet u ofwel het oorspronkelijke type of het bestemmingstype (of beide) wijzigen.

Als je een kolom passeert, controleer dan of je de juiste kolom hebt. Hetzelfde als je een variabele doorgeeft - controleer of het de juiste variabele is.

De volgende conversie slaagt bijvoorbeeld:

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

Resultaat:

{a:10}

En het volgende lukt ook:

SELECT CAST(10 AS char(2));

Resultaat:

10

Afhankelijk van de werkelijke waarde, kunt u proberen de oorspronkelijke waarde om te zetten in een geaccepteerd type.

We kunnen bijvoorbeeld onze oorspronkelijke XML-foutproducerende code wijzigen in de volgende niet-foutproducerende code:

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

Resultaat:

10

In dit geval heeft de bewerking niet gevalideerd dat het resultaat een geldig XML-document is. Het heeft gewoon de oorspronkelijke waarde omgezet in de xml typ.

Dit werkt echter niet altijd, afhankelijk van de waarde die u probeert te converteren. Ons datumvoorbeeld geeft bijvoorbeeld nog steeds een fout (zij het een andere fout):

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

Resultaat:

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

In dit geval krijgen we fout Msg 241, wat een andere fout is. In dit geval is de fout niet te wijten aan het feit dat de conversie niet is toegestaan. Het is te wijten aan de werkelijke waarde die problemen veroorzaakt. In ons geval kan SQL Server het getal 10 niet converteren naar een geldige datum. We zouden de invoerwaarde moeten wijzigen in een meer betekenisvolle waarde die een geldige datum vertegenwoordigt.


  1. Fix:"Onbekende tabel 'locales' in information_schema" in MariaDB

  2. Oracle UTL_SMTP:Voorbeeld van e-mail met bijlage verzenden met Oracle Wallet-verificatie

  3. Hoe vindt u de optimale unieke identifier in een tabel in SQL Server:sp_special_columns

  4. Hoe installeer ik SQL Server op een Mac met VirtualBox