SQL 服务器使用 OPENXML 反序列化 XML
SQL Server deserialize XML with OPENXML
我已经阅读了描述如何将 xml 反序列化为 table 的文档:
https://docs.microsoft.com/en-us/sql/t-sql/functions/openxml-transact-sql?view=sql-server-ver15
在我的场景中,每个 XML 都是一个只有一行的“table”,所以我写了这段代码:
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
我不清楚我是否使用了正确的根节点,以防万一'row'错误,这里设置的是正确的节点。
我得到的错误也很奇怪,它谈论转换为 int,但那里没有 int,只有 XML.
错误:
Msg 245 Level 16 State 1 Line 2
Conversion failed when converting the nvarchar value to data type int.
我期待的是 select 这样的结果:
ACOCLI
ARAGS1
ACOFIS
AEMAIL
ACOAGE
AANNUL
ANOMIG
cod
Some description
cod
Some Name
看起来您实际上只需要 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)');
我已经阅读了描述如何将 xml 反序列化为 table 的文档: https://docs.microsoft.com/en-us/sql/t-sql/functions/openxml-transact-sql?view=sql-server-ver15
在我的场景中,每个 XML 都是一个只有一行的“table”,所以我写了这段代码:
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
我不清楚我是否使用了正确的根节点,以防万一'row'错误,这里设置的是正确的节点。 我得到的错误也很奇怪,它谈论转换为 int,但那里没有 int,只有 XML.
错误:
Msg 245 Level 16 State 1 Line 2 Conversion failed when converting the nvarchar value to data type int.
我期待的是 select 这样的结果:
ACOCLI | ARAGS1 | ACOFIS | AEMAIL | ACOAGE | AANNUL | ANOMIG |
---|---|---|---|---|---|---|
cod | Some description | cod | Some Name |
看起来您实际上只需要 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)');