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)');