SQL Server插入XML参数-空字符串不转换为数字的null

May*_*ayo 5 xml insert sql-server-2008

我有一个存储过程,该过程使用XML参数并将“实体”节点作为记录插入表中。除非其中一个数字字段在XML中的值为空字符串,否则这将正常工作。然后,它将引发“将数据类型nvarchar转换为数字时出错”错误。

有没有一种方法可以告诉SQL将下面代码中的这些数字字段的空字符串转换为null?

-- @importData XML <- stored procedure param
DECLARE @l_index INT

EXECUTE sp_xml_preparedocument @l_index OUTPUT, @importData
INSERT INTO dbo.myTable
(
     [field1]
    ,[field2]
    ,[field3]
)
SELECT
     [field1]
    ,[field2]
    ,[field3]
FROM OPENXML(@l_index, 'Entities/Entity', 1)
    WITH 
    (
         field1 int 'field1'
        ,field2 varchar(40) 'field2'
        ,field3 decimal(15, 2) 'field3'
    )
EXECUTE sp_xml_removedocument @l_index
Run Code Online (Sandbox Code Playgroud)

编辑:并且如果有帮助,示例XML。除非我在上面的代码中注释掉field3或在下面的field3中提供一个值,否则将引发错误。

<?xml version="1.0" encoding="utf-16"?>
<Entities>
  <Entity>
    <field1>2435</field1>
    <field2>843257-3242</field2>
    <field3 />
  </Entity>
</Entities>
Run Code Online (Sandbox Code Playgroud)

mar*_*c_s 4

如果您要使用 SQL Server XQuery,您可以执行以下操作:

SELECT
   nodes.entity.value('(field1)[1]', 'int') 'Field1',
   nodes.entity.value('(field2)[1]', 'varchar(50)') 'Field 2',
   CAST(ISNULL(nodes.entity.value('(field3)[1]', 'varchar(50)'), '0.00') 
        AS DECIMAL(15,2)) 'Field 3'
FROM
   @importData.nodes('/Entities/Entity') AS nodes(entity)
Run Code Online (Sandbox Code Playgroud)

基本上,将 的值转换field3为字符串,如果它为 NULL,则使用 0.00 作为 DECIMAL 值。

我不知道是否有任何方法OPENXML可以做类似的事情......