Ако получавате съобщение за грешка на 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 във валидна дата. Ще трябва да променим входната стойност на по-смислена стойност, която представлява валидна дата.