Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Behebung von Meldung 529 „Explizite Konvertierung vom Datentyp int in xml ist nicht zulässig“ in SQL Server

Wenn Sie die SQL Server-Fehlermeldung 529 erhalten, die so etwas wie Die explizite Konvertierung vom Datentyp int in xml ist nicht zulässig lautet , liegt es wahrscheinlich daran, dass Sie versuchen, eine unzulässige Datentypkonvertierung durchzuführen.

SQL Server lässt bestimmte Konvertierungen nicht zu. Wenn Sie versuchen, eine solche Konvertierung durchzuführen, erhalten Sie diesen Fehler.

Fehlerbeispiel

Hier ist ein Codebeispiel, das den Fehler erzeugt:

SELECT CAST(10 AS xml);

Ergebnis:

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

Hier haben wir versucht, die Zahl 10 in den xml umzuwandeln Typ.

SQL Server lässt eine solche Konvertierung nicht zu und gab daher einen Fehler zurück.

Wir erhalten denselben Fehler, wenn wir versuchen, diesen Wert in ein date umzuwandeln Typ:

SELECT CAST(10 AS date);

Ergebnis:

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

Sie könnten annehmen, dass wir den Fehler mit TRY_CAST() beseitigen könnten funktionieren stattdessen. Aber diese Annahme wäre falsch:

SELECT TRY_CAST(10 AS xml);

Ergebnis:

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

Obwohl der TRY_CAST() -Funktion kann normalerweise verwendet werden, um NULL zurückzugeben anstelle eines Fehlers gilt dies nicht für diesen bestimmten Fehler.

Wenn eine Konvertierung fehlschlägt, weil die Konvertierung nicht erlaubt ist, dann sogar TRY_CAST() (und TRY_CONVERT() ) gibt einen Fehler zurück.

Lösung

Um dies zu beheben, müssen Sie entweder den Originaltyp oder den Zieltyp (oder beides) ändern.

Wenn Sie an einer Säule vorbeifahren, überprüfen Sie, ob Sie die richtige Säule haben. Gleiches gilt, wenn Sie eine Variable übergeben – prüfen Sie, ob es die richtige Variable ist.

Die folgende Konvertierung ist beispielsweise erfolgreich:

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

Ergebnis:

{a:10}

Und folgendes gelingt auch:

SELECT CAST(10 AS char(2));

Ergebnis:

10

Abhängig vom tatsächlichen Wert können Sie versuchen, den ursprünglichen Wert in einen akzeptierten Typ umzuwandeln.

Beispielsweise könnten wir unseren ursprünglichen fehlererzeugenden XML-Code in den folgenden nicht fehlererzeugenden Code ändern:

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

Ergebnis:

10

In diesem Fall hat die Operation nicht validiert, dass das Ergebnis ein gültiges XML-Dokument ist. Es konvertierte einfach den ursprünglichen Wert in den xml Typ.

Dies funktioniert jedoch möglicherweise nicht immer, je nachdem, welchen Wert Sie konvertieren möchten. Beispielsweise erzeugt unser Datumsbeispiel immer noch einen Fehler (wenn auch einen anderen Fehler):

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

Ergebnis:

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

In diesem Fall erhalten wir die Fehlermeldung 241, die ein anderer Fehler ist. In diesem Fall ist der Fehler nicht darauf zurückzuführen, dass die Konvertierung nicht zulässig ist. Es liegt am tatsächlichen Wert, der Probleme verursacht. In unserem Fall kann SQL Server die Zahl 10 nicht in ein gültiges Datum umwandeln. Wir müssten den Eingabewert in einen aussagekräftigeren Wert ändern, der ein gültiges Datum darstellt.