在 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
转换空节点时。我尝试了 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)
我遇到了一个错误
Error converting datatype nvarchar to numeric
使用 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)