如何使用XQuery/T-SQL解析包含嵌套默认名称的客户xml

如何使用XQuery/T-SQL解析包含嵌套默认名称的客户xml,xml,tsql,soap,xquery,xml-namespaces,Xml,Tsql,Soap,Xquery,Xml Namespaces,我有一个客户使用我们开发的平台,该平台允许客户webservice返回数据通过MSSQL中的存储过程进行解析。我们有一个客户将包含嵌套xmlns=“xxxxxx”声明的xml发送回不同的URI位置。首先,这个有效吗?第二,是否可以使用XQuery进行解析?我已经尝试使用t-sql xml数据类型的.value和.query功能来解决这个问题,但“第二个默认名称空间”的作用点似乎是一个边界,使用我知道的技术几乎不可能跨越这个边界。下面是一个示例xml响应: <?xml version

我有一个客户使用我们开发的平台,该平台允许客户webservice返回数据通过MSSQL中的存储过程进行解析。我们有一个客户将包含嵌套xmlns=“xxxxxx”声明的xml发送回不同的URI位置。首先,这个有效吗?第二,是否可以使用XQuery进行解析?我已经尝试使用t-sql xml数据类型的.value和.query功能来解决这个问题,但“第二个默认名称空间”的作用点似乎是一个边界,使用我知道的技术几乎不可能跨越这个边界。下面是一个示例xml响应:

    <?xml version="1.0" encoding="UTF-8"?>
    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
     <soapenv:Body>
      <FF_LOG_RSPD_CONT xmlns="http://xmlns.oracle.com/Enterprise/Tools/schemas/X.V1">
       <FF_LOGIN_WSDL_RSPD>
        <FF_PYIVR_RS_DER xmlns="http://xmlns.oracle.com/Enterprise/Tools/schemas/Y.V1">
         <EMPLID>111111</EMPLID>
         <PIN>2222</PIN>
         <NEW_PIN_FLAG>N</NEW_PIN_FLAG>
         <REVOKE_FLAG>N</REVOKE_FLAG>
         <LAST_4_OF_SSN></LAST_4_OF_SSN>
         <WSDL_SUCCESS_FLAG>Y</WSDL_SUCCESS_FLAG>
        </FF_PYIVR_RS_DER>
       </FF_LOGIN_WSDL_RSPD>
      </FF_LOG_RSPD_CONT>
     </soapenv:Body>
    </soapenv:Envelope>

111111
2222
N
N
Y

能否尝试显式调用名称空间

declare @theXml XML = '<?xml version="1.0" encoding="UTF-8"?>
    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
     <soapenv:Body>
      <FF_LOG_RSPD_CONT xmlns="http://xmlns.oracle.com/Enterprise/Tools/schemas/X.V1">
       <FF_LOGIN_WSDL_RSPD>
        <FF_PYIVR_RS_DER xmlns="http://xmlns.oracle.com/Enterprise/Tools/schemas/Y.V1">
         <EMPLID>111111</EMPLID>
         <PIN>2222</PIN>
         <NEW_PIN_FLAG>N</NEW_PIN_FLAG>
         <REVOKE_FLAG>N</REVOKE_FLAG>
         <LAST_4_OF_SSN></LAST_4_OF_SSN>
         <WSDL_SUCCESS_FLAG>Y</WSDL_SUCCESS_FLAG>
        </FF_PYIVR_RS_DER>
       </FF_LOGIN_WSDL_RSPD>
      </FF_LOG_RSPD_CONT>
     </soapenv:Body>
    </soapenv:Envelope>'

SELECT
    @theXml.value('
        declare namespace ns1="http://schemas.xmlsoap.org/soap/envelope/";
        declare namespace ns2="http://xmlns.oracle.com/Enterprise/Tools/schemas/X.V1";
        declare namespace ns3="http://xmlns.oracle.com/Enterprise/Tools/schemas/Y.V1";
        (/ns1:Envelope/ns1:Body/ns2:FF_LOG_RSPD_CONT/ns2:FF_LOGIN_WSDL_RSPD/ns3:FF_PYIVR_RS_DER/ns3:EMPLID)[1]', 
        'nvarchar(max)') as result

那再简单不过了!谢谢
111111