Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Поправете съобщение 529 „Не е позволено изрично преобразуване от тип данни int в xml“ в SQL Server

Ако получавате съобщение за грешка на SQL Server 529, което чете нещо като Не е разрешено изрично преобразуване от тип данни int в xml , вероятно защото се опитвате да извършите преобразуване на тип данни, което не е разрешено.

SQL Server не позволява определени преобразувания. Ако се опитате да извършите такова преобразуване, ще получите тази грешка.

Пример за грешка

Ето пример за код, който създава грешката:

SELECT CAST(10 AS xml);

Резултат:

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

Тук се опитахме да преобразуваме числото 10 в xml тип.

SQL Server не позволява такова преобразуване и затова върна грешка.

Получаваме същата грешка, ако се опитаме да преобразуваме тази стойност в date тип:

SELECT CAST(10 AS date);

Резултат:

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

Може да предположите, че можем да се отървем от грешката, като използваме TRY_CAST() функция вместо това. Но това предположение би било неправилно:

SELECT TRY_CAST(10 AS xml);

Резултат:

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

Въпреки че TRY_CAST() функцията обикновено може да се използва за връщане на NULL вместо грешка, това не се отнася за тази конкретна грешка.

Когато преобразуването е неуспешно, защото преобразуването не е разрешено, тогава дори TRY_CAST()TRY_CONVERT() ) ще върне грешка.

Решение

За да коригирате това, ще трябва да промените или оригиналния тип, или типа дестинация (или и двете).

Ако предавате колона, проверете дали сте получили правилната колона. Същото, ако предавате променлива – проверете дали е правилната променлива.

Например следното преобразуване е успешно:

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

Резултат:

{a:10}

И следното също е успешно:

SELECT CAST(10 AS char(2));

Резултат:

10

В зависимост от действителната стойност, можете да опитате да преобразувате оригиналната стойност в приет тип.

Например, бихме могли да променим нашия оригинален код за генериране на грешки в XML със следния код без грешка:

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

Резултат:

10

В този случай операцията не потвърди, че резултатът е валиден XML документ. Той просто преобразува оригиналната стойност в xml тип.

Това обаче може да не работи винаги, в зависимост от стойността, която се опитвате да преобразувате. Например нашият пример за дата все още произвежда грешка (макар и различна грешка):

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

Резултат:

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

В този случай получаваме грешка Msg 241, която е различна грешка. В този случай грешката не се дължи на забрана на преобразуването. Това се дължи на действителната стойност, която причинява проблеми. В нашия случай SQL Server не може да преобразува числото 10 във валидна дата. Ще трябва да променим входната стойност на по-смислена стойност, която представлява валидна дата.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Измервате ли производителността на SQL Server с тези показатели?

  2. SQL Server:Динамична клауза where

  3. SQL Server:Разлика между PARTITION BY и GROUP BY

  4. Как да създадете таблица с ограничение на външния ключ в SQL Server - SQL Server / TSQL урок, част 66

  5. Намерете стойност навсякъде в база данни