通过 SQL 服务器 XML 函数处理 XML prolog

Processing XML prolog by SQL Server XML functions

我有一个大型数据库 table,其中有一个 XML 列。 XML 内容是一种文件,如下所示:

<?int-dov version="1.0" encoding="UTF-8" standalone="no"?>
<ds:datastoreItem ds:itemID="{F8484AF4-73BF-45CA-A524-0D796F244F37}" xmlns:ds="http://schemas.openxmlformats.org/officeDocument/2006/customXml"><ds:schemaRefs><ds:schemaRef ds:uri="http://schemas.openxmlformats.org/officeDocument/2006/bibliography"/></ds:schemaRefs></ds:datastoreItem>

我正在寻找在 T-SQL 查询中获取独立属性值的函数或快速方法。当我 运行 以下查询时:

select  XmlContent.query('@standalone') from XmlDocuments

我收到此错误消息:

Msg 2390, Level 16, State 1, Line 4
XQuery [XmlDocuments.XmlContent.query()]: Top-level attribute nodes are not supported

所以,如果有人给我解决这个问题的方法,我将不胜感激。

您可以使用 processing-instruction() function 来获取它。

SELECT @xml.value('./processing-instruction("int-dov")[1]','nvarchar(max)')
Result
version="1.0" encoding="UTF-8" standalone="no"

如果您只想获得 standalone 部分,我发现的唯一方法是从中构建一个 XML 节点:

SELECT CAST(
  N'<x ' +
  @xml.value('./processing-instruction("int-dov")[1]','nvarchar(max)') +
  N' />' AS xml).value('x[1]/@standalone','nvarchar(10)'
Result
no

db<>fiddle

只是为了补充@Charlieface 的回答。所有的功劳都归于他。

SQL

DECLARE @xml XML = 
N'<?int-dov version="1.0" encoding="UTF-8" standalone="no"?>
<ds:datastoreItem ds:itemID="{F8484AF4-73BF-45CA-A524-0D796F244F37}"
                  xmlns:ds="http://schemas.openxmlformats.org/officeDocument/2006/customXml">
    <ds:schemaRefs>
        <ds:schemaRef ds:uri="http://schemas.openxmlformats.org/officeDocument/2006/bibliography"/>
    </ds:schemaRefs>
</ds:datastoreItem>';

SELECT col.value('x[1]/@standalone','nvarchar(10)') AS [standalone]
    , col.value('x[1]/@encoding','nvarchar(10)') AS [encoding]
    , col.value('x[1]/@version','nvarchar(10)') AS [version]
FROM (VALUES(CAST(N'<x ' +
  @xml.value('./processing-instruction("int-dov")[1]','nvarchar(max)') +
  N' />' AS xml))
) AS tab(col);

输出

+------------+----------+---------+
| standalone | encoding | version |
+------------+----------+---------+
| no         | UTF-8    |     1.0 |
+------------+----------+---------+