[英]Error converting datatype nvarchar to numeric for empty XML node in case of OPENXML sql
I was getting an error我收到一个错误
Error converting datatype nvarchar to numeric将数据类型 nvarchar 转换为数字时出错
when converting an empty node using OPENXML
.使用OPENXML
转换空节点时。 I tried different ways of CAST
and CONVERT
methods but still was getting the same error then end up using the following way.我尝试了CAST
和CONVERT
方法的不同方式,但仍然遇到相同的错误,然后最终使用以下方式。
This is the SQL query:这是 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
Commented lines are some other ways I tried then I used the SchemaDeclaration
way.注释行是我尝试过的其他一些方法,然后我使用了SchemaDeclaration
方式。
Any better suggestions?有更好的建议吗?
You can use nodes
function to read the xml.您可以使用nodes
function 来读取 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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.