首页 > 解决方案 > Mssql 如何使用“OPENXML”获取所需的 XML 标记?

问题描述

我正在使用 Microsoft Sql 2012 Express

使用“Soap Service”中的“sp_OAGetProperty”,我得到一个“nvarchar (max)”值,如下所示。

--uuid:ec76ddb3-a0ef-4e4d-980d-2dcddd967e44+id=343  Content-ID: 
<http://tempuri.org/0>  Content-Transfer-Encoding: 8bit  Content-Type: application/xop+xml;charset=utf-8;type="application/soap+xml"    
    <s:Envelope
        xmlns:s="http://www.w3.org/2003/05/soap-envelope">
        <s:Body
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xmlns:xsd="http://www.w3.org/2001/XMLSchema">
            <LoginResponse
                xmlns="http://tempuri.org/">
                <LoginResult>true</LoginResult>
                <sessionID>eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiIwZmIxNTVhMi0wOTgwLTQwMGQtODdkOC1kYTQ4MzZiMTk1YzEiLCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9zaWQiOiI5IiwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNS8wNS9pZGVudGl0eS9jbGFpbXMvbmFtZSI6IlVCTDJAVEVTVC5DT00jghjghU</sessionID>
            </LoginResponse>
        </s:Body>
    </s:Envelope>
--uuid:ec76ddb3-a0ef-4e4d-980d-2dcddd967e44+id=343--  

我正在尝试使用代码从这个 XML 中获取 LoginResult、sessionID 值。

我也将使用此编码延续。示例 我将启动另一个“soapService”并发送 sessionID。

EXEC sp_xml_preparedocument @Yanit OUTPUT,
                            @XML
SELECT LoginResult,
       sessionID
FROM OPENXML(@XML, 's:Envelope/s:Body/LoginResponse')
WITH
(
LoginResult [varchar](500) 'LoginResult',
sessionID [varchar](500) 'sessionID'
)

EXEC sp_xml_removedocument @Yanit

这是我上次尝试的代码,但它向我返回了错误消息。

消息 225,级别 16,状态 12,行 193 为函数“OpenXML”提供的参数无效。

标签: sql-serversoapopenxml

解决方案


我知道这个问题很老,但如果有人有同样的问题,请考虑以下:

  1. 错误消息告诉您参数错误 - 调用 OpenXML 函数时,您需要传递内存中 DOM 表示的引用,该引用在 sp_xml_preparedocument 过程中作为 OUTPUT 参数给出(在您的情况下为变量@Yanit);

  2. 文档:https ://docs.microsoft.com/en-us/sql/t-sql/functions/openxml-transact-sql?view=sql-server-ver15

  3. 使用值为 2 的参数flag来告诉函数在 's:Envelope/s:Body/LoginResponse' 中获取元素(LoginResult、sessionID):

    FROM OPENXML(@XML, 's:Envelope/s:Body/LoginResponse', 2 )


推荐阅读