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

标签 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/>原因:

Error converting data type nvarchar to numeric.

我试过:

NULLIF(t.c.value('NUMHOURS[1]','DECIMAL(11,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)

关于sql - 空 XML 节点导致将数据类型 varchar 转换为数字时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39005094/

相关文章:

xml - 无法使用 node-ftp 或 jsftp 将 XML 文件上传到 FTP

android - 内容辅助在带有支持库的 xml 中不起作用

c# - 如何使用 C# 检索特定的 XML 标签值

sql - 使用随机生成的数字创建临时表名

SQL Server 停止处理 20 秒

mysql - 按问题联合排序

c# - 如何在 C# 中存储 SQL 查询的结果字符串

SQL重新查询同一张表

sql - 使用两个数据库创建查询

sql-server - Jooq with SQL Server 如何选择前 N 个结果