如果节点为空或不存在,我如何简单地插入NULL
?
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)
空节点<NUMHOURS/>
导致:
将数据类型nvarchar转换为数字时出错。
我试过了:
NULLIF(t.c.value('NUMHOURS[1]','DECIMAL(11,2)' ),'')
但似乎在事后导致相同的错误处理。
答案 0 :(得分:2)
您可以为无效数字提供默认值:
select case
when ISNUMERIC(t.c.value('NUMHOURS[1]', 'nvarchar(100)')) <> 1 then NULL
else t.c.value('NUMHOURS[1]', 'decimal(11,2)')
end
from @xml.nodes('/Data/Employee') t(c)
答案 1 :(得分:1)
可能有更好的方法:(对于许多行应该至少更快......):
SELECT t.c.value('let $x:=NUMHOURS[1] return $x cast as xs:decimal?','decimal(11,2)')
FROM @xml.nodes('/Data/Employee') t(c);
如果可能,cast as xs:decimal?
会将值转换为十进制,或返回null。因此,最终的'decimal(11,2)'
不再有类型转换问题......