Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Napraw komunikat 529 „Wyraźna konwersja typu danych typu int do xml jest niedozwolona” w SQL Server

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ę.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak wygenerować skrypt, aby włączyć wszystkie ograniczenia kluczy obcych w bazie danych programu SQL Server — samouczek programu SQL Server/TSQL, część 78

  2. Jak mogę zobaczyć wszystkie znaki specjalne dozwolone w polu varchar lub char w programie SQL Server?

  3. Przykłady konwersji „data” na „datetime2” w SQL Server (T-SQL)

  4. Czy istnieje sposób, aby nie używać nawiasów kwadratowych w SQL Server?

  5. Wstaw znaki w środku ciągu w SQL Server (T-SQL)