sql-server - MS SQL Server - OpenXML - 多个元素

标签 sql-server xml openxml sql-server-openxml

XML 示例:

<POLICY>
    <RISKS>
        <RISK>
            <DRV>1</DRV>
        </RISK>
        <RISK>
            <DRV>2</DRV>
        </RISK>
    </RISKS>
</POLICY>

我想通过此查询选择两个风险元素:

SELECT RISK
FROM OPENXML(@hDOC, 'POLICY/RISKS', 2)
WITH(
    RISK            XML     'RISK'
) AS Z

预期:

1. <RISK><DRV>1</DRV></RISK>
2. <RISK><DRV>2</DRV></RISK>

结果:

1. <RISK><DRV>1</DRV></RISK>

(仅返回第一个元素)

为了进行比较,此查询按预期返回两行:

SELECT DRV
FROM OPENXML(@hDOC, 'POLICY/RISKS/RISK', 2)
WITH(
    DRV         XML     'DRV'
) AS Z

结果:

1. <DRV>1</DRV>
2. <DRV>2</DRV>

所以问题是如何获得两个风险行?

最佳答案

为什么不使用 SQL Server 提供的 native XQuery 支持。 OpenXML 很旧并且有很多问题。

您可以使用 XQuery 支持编写如下查询

DECLARE @hDOC xml   
SET @hDOC='<POLICY>
    <RISKS>
        <RISK>
            <DRV>1</DRV>
        </RISK>
        <RISK>
            <DRV>2</DRV>
        </RISK>
    </RISKS>
</POLICY>'  
SELECT T.c.query('.') AS result  
FROM   @hDOC.nodes('/POLICY/RISKS/RISK') T(c)  
GO 

您将得到输出

1. <RISK><DRV>1</DRV></RISK>
2. <RISK><DRV>2</DRV></RISK>

编辑:如果您仍想使用 OpenXml,请使用如下查询。

DECLARE @DocHandle int 
DECLARE @hDOC VARCHAR(1000)   
SET @hDOC=N'<POLICY>
    <RISKS>
        <RISK>
            <DRV>1</DRV>
        </RISK>
        <RISK>
            <DRV>2</DRV>
        </RISK>
    </RISKS>
</POLICY>'  
EXEC sp_xml_preparedocument @DocHandle OUTPUT, @hDOC 
SELECT RISK
FROM OPENXML(@DocHandle, 'POLICY/RISKS/RISK', 2)
WITH(
    RISK XML     '.'
) AS Z

EXEC sp_xml_removedocument @DocHandle  

您将获得所需的输出。

关于sql-server - MS SQL Server - OpenXML - 多个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48618689/

相关文章:

sql - 可以在表中保存和插入 SQL 查询消息吗?

c# - c#中的参数验证、存储过程和数据访问层

c# - 如何在调用 .LoadXml() 之前检查字符串输入中的有效 xml

php - 段落中第一句的 Xpath 表达式

c# - 从 Open Xml 文档创建 Microsoft Word Interop 文档

c# - 使用 DocumentFormat.OpenXml (C#) 更新 .docx 文档中的目录

c++ - 在 64 位 SQL Server 2008 R2 上运行 32 位扩展存储过程

excel - 为什么 VBA copytoClipboard 不再工作?

nuget - 如何确保OpenXml程序集不会与SpreadsheetLight发生冲突?

sql - 从同一表的一列更新多列值