在 OPENXML sql 的情况下,将空 XML 节点的数据类型 nvarchar 转换为数字时出错

Error converting datatype nvarchar to numeric for empty XML node in case of OPENXML sql

我遇到了一个错误

Error converting datatype nvarchar to numeric

使用 OPENXML 转换空节点时。我尝试了 CASTCONVERT 方法的不同方式,但仍然遇到相同的错误,然后最终使用以下方式。

这是 SQL 查询:

 IF OBJECT_ID('tempdb..#TempData') IS NOT NULL   
     DROP TABLE #TempData   

 DECLARE @XML XML

 SET @XML = '<ArrayOfTempData>
                <TempData>
                    <StudentId>1418431</StudentId>
                    <Name>Bill</Name>
                    <DeptId>2130900</DeptId>
                    <Fees p3:nil="true" xmlns:p3="http://www.w3.org/2001/XMLSchema-instance" />
                </TempData>
                <TempData>
                    <StudentId>1418431</StudentId>
                    <Name>Samuel</Name>
                    <DeptId>2280971</DeptId>
                    <Fees>4628617.156</Fees>
                </TempData>
            </ArrayOfTempData>'

DECLARE @handle INT  
DECLARE @PrepareXmlStatus INT  

EXEC @PrepareXmlStatus= sp_xml_preparedocument @handle OUTPUT, @XML  

SELECT 
    StudentId, Name, DeptId, Fees 
    -- nullif(Fees , '') as Fees,
    -- CASE WHEN Fees = '' THEN NULL ELSE CAST(Fees AS NUMERIC(13, 3)) END AS Fees,
    -- CASE WHEN ISNUMERIC(Fees) <> 1 THEN NULL ELSE CAST(Fees AS NUMERIC(13, 3)) END AS Fees,
    -- CONVERT(NUMERIC(13, 3), NULLIF(Fees, '')) AS Fees
INTO 
    #TempData 
FROM 
    OPENXML(@handle, '/ArrayOfTempData/TempData', 2)  
    WITH (StudentId INT,
          Name VARCHAR(50),
          DeptId INT,
          Fees NUMERIC(13, 3) 'Fees[.!=""]'
         )

SELECT * FROM #TempData

注释行是我尝试过的其他一些方式,然后我使用了 SchemaDeclaration 方式。

有更好的建议吗?

您可以使用nodes函数读取xml。

SELECT StudentId = n.value('(./StudentId)[1]', 'int'), 
       NAME = n.value('(./Name)[1]', 'Varchar(8000)'), 
       DeptId = n.value('(./DeptId)[1]', 'int'), 
       Fees = n.value('(./Fees)[1]', 'Varchar(8000)') 
FROM   @xml.nodes('/ArrayOfTempData/TempData') AS a(n)