Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在OPENXML sql的情况下,将空XML节点的数据类型nvarchar转换为数字时出错_Sql_Sql Server_Xml_Openxml - Fatal编程技术网

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

在OPENXML sql的情况下,将空XML节点的数据类型nvarchar转换为数字时出错,sql,sql-server,xml,openxml,Sql,Sql Server,Xml,Openxml,我犯了个错误 将数据类型nvarchar转换为数字时出错 使用OPENXML转换空节点时。我尝试了不同的CAST和CONVERT方法,但仍然得到相同的错误,然后使用以下方法结束 这是SQL查询: IF OBJECT_ID('tempdb..#TempData') IS NOT NULL DROP TABLE #TempData DECLARE @XML XML SET @XML = '<ArrayOfTempData>

我犯了个错误

将数据类型nvarchar转换为数字时出错

使用OPENXML转换空节点时。我尝试了不同的CAST和CONVERT方法,但仍然得到相同的错误,然后使用以下方法结束

这是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) 
+从我这边。OPENXML及其伙伴sp_xml_PreparedDocument/sp_xml_removedocument是一个专有的Microsoft API。保留它只是为了向后兼容过时的SQL Server 2000。SQLServer2005以后的版本支持w3c的XQuery。