sql-server - SQL Server 使用 OPENXML 反序列化 XML
问题描述
我已阅读描述如何将 xml 反序列化为表的文档: https ://docs.microsoft.com/en-us/sql/t-sql/functions/openxml-transact-sql?view=sql-server-ver15
在我的场景中,每个 XML 都是一个只有一行的“表”,所以我编写了以下代码:
DECLARE @data AS NVARCHAR(4000) = N'<row ACOCLI="cod" ARAGS1="Some description"
ACOFIS="cod" AEMAIL=" " ACOAGE=" " AANNUL=" " ANOMIG="Some Name"/>';
SELECT *
FROM OPENXML (@data,'row' ,0);
https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=94d10fa2f6c4f0eb580d5166c07f4553
我不清楚我是否使用了正确的根节点,如果“行”是错误的,那么在此处设置的节点是正确的。我得到的错误也很奇怪,它谈论强制转换为 int,但那里没有 int,只有 XML。
错误:
消息 245 级别 16 状态 1 第 2 行 将 nvarchar 值转换为数据类型 int 时转换失败。
我期待的是这样的选择结果:
阿科利 | ARAGS1 | 阿科菲斯 | 电子邮件 | ACOAGE | 年度 | 失常 |
---|---|---|---|---|---|---|
鳕鱼 | 一些说明 | 鳕鱼 | 一些名字 |
解决方案
似乎您实际上只需要value
操作员:
DECLARE @data AS xml = N'<row ACOCLI="00330" ARAGS1="Some description" ACOFIS="01266820248" AEMAIL=" " ACOAGE=" " AANNUL=" " ANOMIG="Some Name"/>';
SELECT @data.value('(row/@ACOCLI)[1]','varchar(6)'),
@data.value('(row/@ARAGS1)[1]','varchar(30)'),
@data.value('(row/@ACOFIS)[1]','varchar(15)'),
@data.value('(row/@AEMAIL)[1]','varchar(6)'),
@data.value('(row/@ACOAGE)[1]','varchar(6)'),
@data.value('(row/@AANNUL)[1]','varchar(6)'),
@data.value('(row/@ANOMIG)[1]','varchar(15)');
推荐阅读
- javascript - 如何将列表附加到 FormData?
- c# - 垃圾收集器不以相同的方法处理 Excel 实例
- java - 我如何解决空指针异常我无法在我的片段上得到任何东西
- android - 如何使用图像选择意图在android中获取图像计数
- c++ - C++中Mastermind算法的递归for循环
- javascript - jQuery根据表格标签和复选框选择对所有值求和
- linux - duplicity + rsync 仍然使用 --rsync-options 备份排除的文件
- java - 将变量传递给另一个Java类
- unreal-engine4 - DelegateBase.h 中相同结构的双重声明?
- spring-cloud-stream - 在 Spring Cloud Stream Kinesis 中将多个流监听到一个 @StreamListener