Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Correção da Msg 529 “A conversão explícita do tipo de dados int para xml não é permitida” no SQL Server


Se você estiver recebendo a mensagem de erro 529 do SQL Server que lê algo como A conversão explícita do tipo de dados int para xml não é permitida , provavelmente é porque você está tentando realizar uma conversão de tipo de dados que não é permitida.

O SQL Server não permite determinadas conversões. Se você tentar realizar essa conversão, receberá esse erro.

Exemplo de erro


Aqui está um exemplo de código que produz o erro:
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.

Aqui, tentamos converter o número 10 para o xml tipo.

O SQL Server não permite essa conversão e, portanto, retornou um erro.

Recebemos o mesmo erro se tentarmos converter esse valor em uma 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.

Você pode supor que poderíamos nos livrar do erro usando o TRY_CAST() função em vez disso. Mas essa suposição seria incorreta:
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.

Embora o TRY_CAST() A função normalmente pode ser usada para retornar NULL em vez de um erro, isso não se aplica a esse erro específico.

Quando uma conversão falha devido à conversão não ser permitida, mesmo TRY_CAST() (e TRY_CONVERT() ) retornará um erro.

Solução


Para corrigir isso, você precisa alterar o tipo original ou o tipo de destino (ou ambos).

Se você está passando uma coluna, verifique se você tem a coluna certa. O mesmo se você estiver passando uma variável - verifique se é a variável correta.

Por exemplo, a seguinte conversão é bem-sucedida:
SELECT CAST('{a:10}' AS xml);

Resultado:
{a:10}

E o seguinte também é bem-sucedido:
SELECT CAST(10 AS char(2));

Resultado:
10

Dependendo do valor real, você pode tentar converter o valor original em um tipo aceito.

Por exemplo, poderíamos alterar nosso código de produção de erros XML original para o seguinte código de produção sem erros:
SELECT CAST(CAST(10 AS varchar) AS xml);

Resultado:
10

Nesse caso, a operação não validou que o resultado é um documento XML válido. Ele simplesmente converteu o valor original no xml tipo.

No entanto, isso pode nem sempre funcionar, dependendo do valor que você está tentando converter. Por exemplo, nosso exemplo de data ainda produz um erro (embora, um erro 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.

Nesse caso, obtemos o erro Msg 241, que é um erro diferente. Nesse caso, o erro não é devido à não permissão da conversão. É devido ao valor real causando problemas. No nosso caso, o SQL Server não pode converter o número 10 em uma data válida. Precisaríamos alterar o valor de entrada para um valor mais significativo que representasse uma data válida.