Sql server Soapenv解析错误

Sql server Soapenv解析错误,sql-server,xml,tsql,Sql Server,Xml,Tsql,在SQL Server 2012中,我无法从如下所示的XML中获取值。请帮忙 <soapenv:Envelope xmlns:soapenv="http://schemas.abc.org/soap/envelope/" xmlns:wsap="http://schemas.abc.com/abcd"> <soapenv:Header xmlns:wsap="http://schemas.abc.com/abcd" xmlns:soapenv="http://schemas

在SQL Server 2012中,我无法从如下所示的XML中获取值。请帮忙

<soapenv:Envelope xmlns:soapenv="http://schemas.abc.org/soap/envelope/" xmlns:wsap="http://schemas.abc.com/abcd">
  <soapenv:Header xmlns:wsap="http://schemas.abc.com/abcd" xmlns:soapenv="http://schemas.example.org/soap/envelope/">
    <header xmlns:wsap="http://schemas.abc.com/abcd" xmlns:soapenv="http://schemas.example.org/soap/envelope/" xmlns="http://schemas.abc.com/General/1.0/">
      <msg-id>0673c07b-2b67-11e7-f959-0b3aae0b96ad</msg-id>
    </header>
  </soapenv:Header>
  <soapenv:Body>
    <GetInvoice_DataResponse xmlns:soapenv="http://schemas.example.org/soap/abcd/" xmlns="http://schemas.abc.com/abcd" preserveSpace="no" qAccess="0">
      <tuple xmlns="http://schemas.abc.com/abcd">
        <old>
          <S_ORDER xmlns="http://schemas.abc.com/abcd">
            <BILLING_TYPE>Paid</BILLING_TYPE>
            <CREATED>2017-11-13T10:40:28.0</CREATED>
            <CREATED_BY>1-455454asdas</CREATED_BY>
            <LAST_UPD>2017-11-13T10:40:29.0</LAST_UPD>
            <LAST_UPD_BY>1-dsafasc</LAST_UPD_BY>
            <INVC_DT>2017-11-13T00:00:00.0</INVC_DT>
            <INVC_NUM>dasda123</INVC_NUM>
            <STATUS_CD>New</STATUS_CD>
            <X_CANCELLATION_REASON xmlns:xsi="http://www.example.org/2001/exap-example" null="true" xsi:nil="true" />
            <GROSS_AMT>1768</GROSS_AMT>
            <ITEM_DTL_AMT>1381.25</ITEM_DTL_AMT>
            <ACCNT_ID>1-sad</ACCNT_ID>
            <ORDER_ID>1-fasdf</ORDER_ID>
            <GROSS_AMT>1768</GROSS_AMT>
            <DIV_ID>1-fas</DIV_ID>
            <ORDER_NUM>Osasaasf</ORDER_NUM>
            <PART>264731200101</PART>
            <ORDER_DT>20171113</ORDER_DT>
            <INVOICE_DT>20171113</INVOICE_DT>
            <ORDER_TYPE>ads fd</ORDER_TYPE>
            <QTY>1</QTY>
            <LINE_NUM>1</LINE_NUM>
            <INVC_STATUS>New</INVC_STATUS>
            <LINE_ITEM_STATUS>Invoiced</LINE_ITEM_STATUS>
            <BU>CVBU</BU>
          </S_ORDER>
        </old>
      </tuple>
      <tuple xmlns="http://schemas.abc.com/abcd">
        <old>
          <S_ORDER xmlns="http://schemas.abc.com/abcd">
            <BILLING_TYPE>Paid</BILLING_TYPE>
            <CREATED>2017-11-13T10:40:28.0</CREATED>
            <CREATED_BY>1-das</CREATED_BY>
            <LAST_UPD>2017-11-13T10:40:29.0</LAST_UPD>
            <LAST_UPD_BY>1-safdfa</LAST_UPD_BY>
            <INVC_DT>2017-11-13T00:00:00.0</INVC_DT>
            <INVC_NUM>afsfas415415</INVC_NUM>
            <STATUS_CD>New</STATUS_CD>
            <X_CANCELLATION_REASON xmlns:xsi="http://www.example.org/2001/exap-example" null="true" xsi:nil="true" />
            <GROSS_AMT>1768</GROSS_AMT>
            <ITEM_DTL_AMT>0</ITEM_DTL_AMT>
            <ACCNT_ID>1-fasf</ACCNT_ID>
            <ORDER_ID>1-saf</ORDER_ID>
            <GROSS_AMT>1768</GROSS_AMT>
            <DIV_ID>1-1IJGRE5</DIV_ID>
            <ORDER_NUM>fasf-sf-s-fd-gd</ORDER_NUM>
            <PART>0000079641</PART>
            <ORDER_DT>20171113</ORDER_DT>
            <INVOICE_DT>20171113</INVOICE_DT>
            <ORDER_TYPE>fasdf d</ORDER_TYPE>
            <QTY>1</QTY>
            <LINE_NUM>2</LINE_NUM>
            <INVC_STATUS>New</INVC_STATUS>
            <LINE_ITEM_STATUS>Invoiced</LINE_ITEM_STATUS>
            <BU>CVBU</BU>
          </S_ORDER>
        </old>
      </tuple>
    </GetInvoice_DataResponse>
  </soapenv:Body>
</soapenv:Envelope>
如果XML位于XML类型的@Input变量中,可以尝试以下方法:

-- define your XML namespaces used in the XML document
;WITH XMLNAMESPACES ('http://schemas.abc.org/soap/envelope/' AS soapenv, 
                     'http://schemas.abc.com/abcd' AS inv)
SELECT  
    -- "reach into" the XML fragment representing the "<S_ORDER>" element
    -- and get the individual subelements from it - using the *default*
    -- XML namespace for those subelements
    BillingType = xc.value('(inv:BILLING_TYPE)[1]', 'varchar(50)'),
    Created = xc.value('(inv:CREATED)[1]', 'varchar(50)')
FROM
    -- define the path down to the "<S_ORDER>" elements, and fetch
    -- an "in-memory" table of each of those elements as a XML fragment
    @input.nodes('/soapenv:Envelope/soapenv:Body/inv:GetInvoice_DataResponse/inv:tuple/inv:old/inv:S_ORDER') AS XT(XC)

要点是:您需要在XQuery中尊重并包含XML名称空间

我需要获得S_Order中的BILLING_TYPE、CREATED等值,显示您的代码!你试过什么?您是否有错误-如果有:哪些错误?记住:我们看不到你的屏幕,也看不到你的思想——你必须向我们展示!嗨,马克,我试着阅读如下内容-选择N.C.value'BILLING_TYPE[1],'nvarchar80',N.C.value'CREATED[1],'datetime',N.C.value'CREATED_BY[1],'varchar50',等等,N.C.value'LAST_UPD_BY[1],'varchar50',N.C.value'INVC_DT[1],'datetime FROM@pXMLFile.nodes'/GetInvoice_DataResponse/tuple/old/S_ORDER'N C有什么帮助?问题是什么?你想做什么,失败的是什么?此外,SQL Server不是web服务客户端。为什么要解析数据库中的web服务响应?您好,Panagiotis,我想从上面的soap xml中获取计费类型、创建、创建人等。其中的所有值都按顺序存储到我的sql server表中