Leerer XML-Knoten verursacht Fehler beim Umwandeln des datatyps varchar in numerisch

Wie kann ich einfach NULL insert, wenn der Knoten leer oder nicht vorhanden ist?

 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 tcvalue('NUMHOURS[1]','DECIMAL(11,2)' ) FROM @xml.nodes('/Data/Employee') t(c) 

Der leere Knoten <NUMHOURS/> verursacht:

Fehler beim Umwandeln des datatyps nvarchar in numerisch.

Ich habe versucht:

 NULLIF(tcvalue('NUMHOURS[1]','DECIMAL(11,2)' ),'') 

aber das scheint zu verarbeiten, nachdem die Tatsache, dass die gleichen Fehler.

Sie können einen Standardwert für ungültige Nummern angeben:

 select case when ISNUMERIC(tcvalue('NUMHOURS[1]', 'nvarchar(100)')) <> 1 then NULL else tcvalue('NUMHOURS[1]', 'decimal(11,2)') end from @xml.nodes('/Data/Employee') t(c) 

Es könnte einen besseren Ansatz geben: (sollte bei unseren Reihen mindestens schneller sein …):

 SELECT tcvalue('let $x:=NUMHOURS[1] return $x cast as xs:decimal?','decimal(11,2)') FROM @xml.nodes('/Data/Employee') t(c); 

Die cast as xs:decimal? wertet den Wert auf die Dezimalzahl, wenn möglich, oder gibt null zurück. So hat die endgültige 'decimal(11,2)' kein Typumwandlungsproblem mehr …