sql - 在 OPENXML sql 的情况下,将数据类型 nvarchar 转换为空 XML 节点的数字时出错
问题描述
我收到一个错误
将数据类型 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)
推荐阅读
- c - 如何将格式化字符串直接写入文件描述符
- reactjs - 如何正确传递数据以启用分组功能
- dashboard - 如何在 Looker 中创建“子仪表板”?
- reactjs - 覆盖,点击消失,reactjs
- node.js - 在多个数据库mongodb集群上实现事务[node mongoose]
- ruby-on-rails - 将 ruby 版本更新到 3.0.2 后,Rails 生成迁移不起作用
- r - 根据前一天在R中填写值
- powershell - 如何按名称顺序连接目录中所有文件的内容?
- javascript - 如何检查提供给回调的参数数量?
- python - 我只想打印 1 个来自 GoogleNews 的报道