空XML节点导致将数据类型varchar转换为数字时出错

时间:2016-08-17 19:47:45

标签: sql sql-server xml null decimal

如果节点为空或不存在,我如何简单地插入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)' ),'')

但似乎在事后导致相同的错误处理。

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)'不再有类型转换问题......