Heute kam es in einem meiner Projekt zu folgendem Fehler
Msg 6841, Level 16, State 1, Line 1
FOR XML konnte die Daten für den 'Tabelle'-Knoten nicht serialisieren, weil ein in XML unzulässiges Zeichen (0x0000) enthalten ist. Um diese Daten mithilfe von FOR XML abzurufen, konvertieren Sie sie in den Datentyp 'binary', 'varbinary' oder 'image', und verwenden Sie die BINARY BASE64-Direktive.
Nach kurzem Suchen bemerkte ich dann, dass nicht die Ausgabe mittels FOR XML fehlerhaft war, sondern in einzelnen Feldern einer Tabelle CHAR(0)-Zeichen enthalten waren, die da nicht hingehörten. Die Tabelle wird von anderer Stelle gefüllt und eigentlich wird dabei der entsprechende Text abgeschnitten, dieses Sonderzeichens in dem Fall wohl aber nicht mehr. Nachdem die Befüllung geändert wurde, mussten die bereits geschriebenen CHAR(0)-Einträge noch geändert werden, doch dass stellte sich als schwerer heraus als zuerst angenommen. Sicher war, dass die Zeichen nur am Ende eines Textes vorkamen. Zum Testen gab es folgende temporäre Tabelle
DECLARE @test table(
Name varchar(30) NULL COLLATE Latin1_General_CI_AS
)
INSERT INTO @test (Name)
SELECT 'Hallo Welt 1' + CHAR(0) + CHAR(0) + CHAR(0) + CHAR(0)
UNION ALL SELECT 'Hallo Welt 2' + CHAR(0)
UNION ALL SELECT 'Hallo Welt 3'
UNION ALL SELECT ''
UNION ALL SELECT CHAR(0)
UNION ALL SELECT CHAR(0) + CHAR(0)
UNION ALL SELECT NULL
Das Problem sollte schnell gelöst werden können.
UPDATE @test
SET Name = SUBSTRING(Name, 1, CHARINDEX(CHAR(0), Name) - 1)
WHERE Name LIKE '%' + CHAR(0) + '%'
Sieht einfach aus, macht - zumindest theoretisch - genau dass, was ich will, funktioniert aber nicht :(
vollständigen Artikel anzeigen...