Wie füge ich einfach NULL
ein, wenn der Knoten leer oder nicht vorhanden ist?Empty XML-Knoten verursacht Fehler beim Konvertieren des Datentyps varchar in numerisch
CREATE TABLE myxml (
"hours" DECIMAL(11,2)
);
DECLARE @xml XML =
'<?xml version="1.0" encoding="UTF-8"?>
<Data>
<Employee>
<NUMHOURS>0.5</NUMHOURS>
</Employee>
<Employee/>
<Employee>
<NUMHOURS>5</NUMHOURS>
</Employee>
<Employee>
<NUMHOURS/>
</Employee>
</Data>';
INSERT INTO myxml ("hours")
SELECT
t.c.value('NUMHOURS[1]','DECIMAL(11,2)')
FROM @xml.nodes('/Data/Employee') t(c)
Der leere Knoten <NUMHOURS/>
verursacht:
Fehlerdatentyp nvarchar in numerische Umwandlung.
Ich habe versucht:
NULLIF(t.c.value('NUMHOURS[1]','DECIMAL(11,2)'),'')
aber das scheint nach der Tat verarbeitet werden im gleichen Fehler führt.
Ein leerer Knoten wird von SQL Server nicht als null betrachtet, es gilt als eine leere [b] Zeichenfolge [/ b]. Im Gegensatz dazu wird die Abwesenheit eines Knotens als null betrachtet. In Ihrem Fall sollten Sie 'CAST (NULLIF (t.cvalue ('NUMHOURS [1]', 'varchar (13)'), '') AS DECIMAL (11,2))' verwenden. Sie könnten 'varchar (13)' in etwas Größeres ändern, um für ungültige Werte (die nicht 'dezimal (11,2)' passen) –
oder Sie können versuchen, SELECT tcvalue ('(./ text()) [ 1] ',' DECIMAL (11,2) ') FROM @ xml.nodes ('/Daten/Mitarbeiter/NUMHOURS ') t (c) ' – JamieD77