共用方式為


SOAP 回應訊息結構

未來的 Microsoft SQL Server 版本將移除這項功能。請避免在新的開發工作中使用這項功能,並規劃修改目前使用這項功能的應用程式。

本主題描述 SOAP 回應訊息結構,如果您想要剖析 SOAP 回應,而不使用 Visual Studio 2005 提供的 Proxy 類別,就非常適合閱讀。

SQL Server 執行個體所傳回的 SOAP 回應訊息包含下列其中一或多項:

  • SELECT 查詢的結果集。

  • 預存程序及使用者定義函數的傳回碼。

  • 資料列計數。這是受到查詢影響的資料列數目。

  • 輸出參數值。

  • 警告的錯誤訊。

下列是 SQL Server 在執行預存程序後所傳回的 SOAP 回應結構片段:

<?xml version="1.0" encoding="utf-8" ?> 
<SOAP-ENV:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
  ...>
  <SOAP-ENV:Body>
  <method:MethodNameResponse>
  <method:MethodNameResult  
 xsi:type="sqlresultstream:SqlResultStream">
<!-- 
  the results are returned here
-->
  </method:MethodNameResult>
  <method:OutputParam>Value</method:OutputParam> 
  </method:MethodNameResponse>
  </SOAP-ENV:Body>
  </SOAP-ENV:Envelope>

作業的結果會包裝在 SOAP 主體的 <MethodNameResponse> 元素中。<MethodNameResponse> 元素可包含下列子元素:

  • <MethodNameResult> 包含結果、資料列計數值以及錯誤訊息和警告。

  • <OutputParameter> 包含預存程序傳回的輸出參數 (若有的話)。

&lt;MethodNameResult&gt; 元素

作業的結果會傳回 <MethodNameResult> 元素內部,其中 MethodName 是預存程序或使用者定義之函數的名稱,或特定批次查詢的 sqlbatchsqlbatch 是用來執行特定查詢的方法。

在 <MethodNameResult> 元素內部,結果會如下序列化:

  • SELECT 陳述式的結果是包裝在 <SqlRowSet> 元素中。在 <SqlRowSet> 元素中序列化的結果將使用 DiffGram 序列化格式。DiffGram 格式是包含在 Microsoft.NET Framework 的 DataSet 元件中。在此情況下,回應也會在資料的前面包含 XSD 結構描述 (如果結束點是以啟用的結構描述所建立)。在 Visual Studio 2005 用戶端中,將以 System.Data.DataSet 物件傳回結果。

    [!附註]

    若要在使用 Visual Studio 2005 時,將 SOAP 結果載入 System.Data.DataSet 物件,SQL Server 必須在它傳回給用戶端的 SOAP 回應中包含內嵌結構描述。在建立結束點時,只要省略 SCHEMA 關鍵字或指定 SCHEMA=STANDARD,就可以啟用此行為。如需詳細資訊,請參閱<CREATE ENDPOINT (Transact-SQL)>。

  • SELECT ...FOR XML 陳述式的結果是包裝在 <SqlXml> 元素中。如果傳回了多個結果集 (例如包含多個 SELECT...FOR XML 查詢的預存程序),每個結果集都會包裝在自己的 <SqlXml> 元素中。此外,每個結果的後面都會加上 <SqlRowCount> 元素。此元素會傳回查詢所影響的資料列數目,如下列回應片段所示:

    <tns:MethodNameResponse>
      <tns:MethodNameResult 
    xsi:type="sqlsoaptypes:SqlResultStream">
         <sqlresultstream:SqlXml xsi:type="sqlsoaptypes:SqlXml" >
     <SqlXml>
        <!-- XML result --> 
     </SqlXml>
    </sqlresultstream:SqlXml>
    <sqlresultstream:SqlRowCount xsi:type="sqlrowcount:SqlRowCount">
       <sqlrowcount:Count>NoOfRowsAffected</sqlrowcount:Count> 
    </sqlresultstream:SqlRowCount>
    <sqlresultstream:SqlXml xsi:type="sqlsoaptypes:SqlXml" >
      <SqlXml>
        <!-- XML Document that maps to XMLElement object 
       in the client--> 
      </SqlXml>
    </sqlresultstream:SqlXml>
    <sqlresultstream:SqlRowCount xsi:type="sqlrowcount:SqlRowCount">
       <sqlrowcount:Count>NoOfRowsAffected</sqlrowcount:Count> 
    </sqlresultstream:SqlRowCount>
    
         <!-- more results ...-->
      </tns:MethodNameResult>
      <tns:OutputParam>Value</tns:OutputParam> 
    </tns:MethodNameResponse>
    

    如果 SELECT ...FOR XML 查詢指定 XMLSCHEMA 選項以要求 XSD 結構描述,則會以 <SqlXml> 元素的第一個子元素傳回 XSD 結構描述。

    在 Visual Studio 2005 用戶端中,會以 System.Xml.XmlElement 物件傳回結果。

  • 預存程序和使用者定義函數的傳回碼值會包裝在 <SqlResultCode> 元素中,如下列回應片段所示:

    <tns:MethodNameResponse>

      <tns:MethodNameResult 
    xsi:type="sqlsoaptypes:SqlResultStream">
      <!-- 
        results 
      -->
         <sqlresultstream:SqlResultCode
    xsi:type="sqlsoaptypes:SqlResultCode">
       ReturnCodeValue
         </sqlresultstream:SqlResultCode> 
      </tns:MethodNameResult>
      <tns:OutputParam>Value</tns:OutputParam> 
    </tns:MethodNameResponse>
    

    在 Visual Studio 2005 用戶端中,傳回碼將以物件傳回。

  • SQL Server 的錯誤訊息、警告以及其他參考用的訊息將包裝在 <SqlMessage> 元素中,如下列 SOAP 回應片段所示:

    <tns:MethodNameResponse>
      <tns:MethodNameResult xsi:type="sqlresultstream:SqlResultStream">
         <sqlresultstream:SqlMessage>
        <!-- Error message returned as SqlMessage object 
     in the client --> 
    </sqlresultstream:SqlMessage>
     ...
      </tns:MethodNameResult>
      <!-- followed by one or more return parameters ->
       ...
    </tns:MethodNameResponse>
    

    下列 SOAP 回應片段是執行 GetCustomerInfo 預存程序所傳回的。如需有關執行此預存程序的資訊,請參閱<傳送原生 XML Web Service 要求的範例應用程式>。預存程序中的第一個 INSERT 陳述式失敗。這將造成下列回應。

    <method:GetCustomerInfoResponse>
     <method:GetCustomerInfoResult 
        xsi:type="sqlresultstream:SqlResultStream">
        <sqlresultstream:SqlMessage>
         <sqlresultstream:SqlMessage xsi:type="sqlmessage:SqlMessage">
    <sqlmessage:Class>16</sqlmessage:Class> 
    <sqlmessage:LineNumber>12</sqlmessage:LineNumber> 
    <sqlmessage:Message>Cannot insert the value NULL into column 
    'CompanyName', table 'Northwind.dbo.Customers'; 
    column does not allow nulls. INSERT fails. 
    </sqlmessage:Message> 
         <sqlmessage:Number>515</sqlmessage:Number> 
         <sqlmessage:Procedure>GetCustomerInfo</sqlmessage:Procedure> 
         <sqlmessage:Server>SQLServerName</sqlmessage:Server> 
         <sqlmessage:Source>MicrosofTransact-
    SQL/9.0</sqlmessage:Source> 
         <sqlmessage:State>2</sqlmessage:State> 
        </sqlresultstream:SqlMessage>
        <sqlresultstream:SqlRowCount xsi:type="sqlrowcount:SqlRowCount">
     <sqlrowcount:Count>0</sqlrowcount:Count> 
        </sqlresultstream:SqlRowCount> 
        <sqlresultstream:SqlResultCode 
      xsi:type="sqlsoaptypes:SqlResultCode">-6 
        </sqlresultstream:SqlResultCode> 
      </method:GetCustomerInfoResult>
      <!-- followed by one or more output parameters ->
     </method:GetCustomerInfoResponse>
    </tns:MethodNameResponse>
    

    在 Visual Studio 2005 用戶端中,這些結果會以 SqlMessage 物件類型傳回。

&lt;OutputParameter&gt; 元素

每個輸出參數值都是以包裝在元素中的方式傳回。元素名稱是輸出參數的名稱。注意,此元素會出現在 <MethodNameResult> 元素的後面,做為 <MethodNameResponse> 元素的最後子項;如下列 SOAP 回應片段中所示。會傳回兩個輸出參數。

<tns:MethodNameResponse>
   <tns:MethodNameResult xsi:type="sqlresultstream:SqlResultStream">
     <!-- results, error messages and warnings -->
   </tns:MethodNameResult>
   <tns:OutputParam1>Value</tns:OutputParam1> 
   <tns:OutputParam2>Value</tns:OutputParam2> 
</tns:MethodNameResponse>