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