Jeśli otrzymujesz komunikat o błędzie SQL Server 529, który brzmi jak Jawna konwersja typu danych int do xml jest niedozwolona , prawdopodobnie dlatego, że próbujesz przeprowadzić konwersję typu danych, która nie jest dozwolona.
SQL Server nie zezwala na niektóre konwersje. Jeśli spróbujesz przeprowadzić taką konwersję, otrzymasz ten błąd.
Przykład błędu
Oto przykład kodu, który generuje błąd:
SELECT CAST(10 AS xml);
Wynik:
Msg 529, Level 16, State 2, Line 1 Explicit conversion from data type int to xml is not allowed.
Tutaj próbowaliśmy przekonwertować liczbę 10 na xml
typ.
SQL Server nie pozwala na taką konwersję, więc zwrócił błąd.
Ten sam błąd pojawia się, gdy próbujemy przekonwertować tę wartość na date
typ:
SELECT CAST(10 AS date);
Wynik:
Msg 529, Level 16, State 2, Line 1 Explicit conversion from data type int to date is not allowed.
Możesz założyć, że możemy pozbyć się błędu za pomocą TRY_CAST()
funkcja zamiast. Ale to założenie byłoby błędne:
SELECT TRY_CAST(10 AS xml);
Wynik:
Msg 529, Level 16, State 2, Line 1 Explicit conversion from data type int to xml is not allowed.
Chociaż TRY_CAST()
funkcja może normalnie być używana do zwrócenia NULL
zamiast błędu, który nie dotyczy tego konkretnego błędu.
Gdy konwersja nie powiedzie się z powodu niedozwolonej konwersji, wtedy nawet TRY_CAST()
(i TRY_CONVERT()
) zwróci błąd.
Rozwiązanie
Aby to naprawić, musisz zmienić albo oryginalny typ, albo typ docelowy (lub oba).
Jeśli przekazujesz kolumnę, sprawdź, czy masz właściwą kolumnę. To samo, jeśli przekazujesz zmienną – sprawdź, czy jest to właściwa zmienna.
Na przykład następująca konwersja powiodła się:
SELECT CAST('{a:10}' AS xml);
Wynik:
{a:10}
A także powiedzie się:
SELECT CAST(10 AS char(2));
Wynik:
10
W zależności od rzeczywistej wartości możesz spróbować przekonwertować oryginalną wartość na akceptowany typ.
Na przykład możemy zmienić nasz oryginalny kod generujący błąd XML na następujący kod, który nie generuje błędów:
SELECT CAST(CAST(10 AS varchar) AS xml);
Wynik:
10
W tym przypadku operacja nie potwierdziła, że wynik jest prawidłowym dokumentem XML. Po prostu przekonwertował oryginalną wartość na xml
typ.
Jednak może to nie zawsze działać, w zależności od wartości, którą próbujesz przekonwertować. Na przykład nasz przykład z datą nadal wyświetla błąd (choć inny błąd):
SELECT CAST(CAST(10 AS varchar) AS date);
Wynik:
Msg 241, Level 16, State 1, Line 1 Conversion failed when converting date and/or time from character string.
W takim przypadku otrzymujemy błąd Msg 241, który jest innym błędem. W takim przypadku błąd nie jest spowodowany zablokowaniem konwersji. Wynika to z rzeczywistej wartości powodującej problemy. W naszym przypadku SQL Server nie może przekonwertować liczby 10 na prawidłową datę. Musielibyśmy zmienić wartość wejściową na bardziej znaczącą wartość, która reprezentuje prawidłową datę.