通过 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
只是为了补充@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 |
+------------+----------+---------+
我有一个大型数据库 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 |
只是为了补充@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 |
+------------+----------+---------+