Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Correzione del messaggio 529 "Non è consentita la conversione esplicita dal tipo di dati int a xml" in SQL Server

Se ricevi un messaggio di errore SQL Server 529 che legge qualcosa come Non è consentita la conversione esplicita dal tipo di dati int a xml , probabilmente è perché stai tentando di eseguire una conversione del tipo di dati non consentita.

SQL Server non consente determinate conversioni. Se provi a eseguire una tale conversione, riceverai questo errore.

Esempio di errore

Ecco un esempio di codice che produce l'errore:

SELECT CAST(10 AS xml);

Risultato:

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

Qui, abbiamo provato a convertire il numero 10 in xml digitare.

SQL Server non consente tale conversione e quindi ha restituito un errore.

Otteniamo lo stesso errore se proviamo a convertire quel valore in una date digita:

SELECT CAST(10 AS date);

Risultato:

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

Potresti presumere che potremmo eliminare l'errore utilizzando TRY_CAST() funzione invece. Ma questa ipotesi non sarebbe corretta:

SELECT TRY_CAST(10 AS xml);

Risultato:

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

Sebbene il TRY_CAST() normalmente la funzione può essere usata per restituire NULL invece di un errore, ciò non si applica a questo particolare errore.

Quando una conversione non riesce perché la conversione non è consentita, anche TRY_CAST() (e TRY_CONVERT() ) restituirà un errore.

Soluzione

Per risolvere questo problema, dovresti cambiare il tipo originale o il tipo di destinazione (o entrambi).

Se stai passando una colonna, controlla di avere la colonna giusta. Lo stesso se stai passando una variabile:controlla che sia la variabile giusta.

Ad esempio, la seguente conversione ha esito positivo:

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

Risultato:

{a:10}

E anche quanto segue:

SELECT CAST(10 AS char(2));

Risultato:

10

A seconda del valore effettivo, puoi provare a convertire il valore originale in un tipo accettato.

Ad esempio, potremmo modificare il nostro codice XML originale che produce errori con il seguente codice che non produce errori:

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

Risultato:

10

In questo caso, l'operazione non ha verificato che il risultato sia un documento XML valido. Ha semplicemente convertito il valore originale in xml digitare.

Tuttavia, questo potrebbe non funzionare sempre, a seconda del valore che stai cercando di convertire. Ad esempio, il nostro esempio di data produce ancora un errore (sebbene un errore diverso):

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

Risultato:

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

In questo caso, otteniamo l'errore Msg 241, che è un errore diverso. In questo caso, l'errore non è dovuto al fatto che la conversione non è consentita. È dovuto al valore effettivo che causa problemi. Nel nostro caso, SQL Server non può convertire il numero 10 in una data valida. Avremmo bisogno di cambiare il valore di input in un valore più significativo che rappresenti una data valida.