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> 包含預存程序傳回的輸出參數 (若有的話)。
<MethodNameResult> 元素
作業的結果會傳回 <MethodNameResult> 元素內部,其中 MethodName 是預存程序或使用者定義之函數的名稱,或特定批次查詢的 sqlbatch。sqlbatch 是用來執行特定查詢的方法。
在 <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 物件類型傳回。
<OutputParameter> 元素
每個輸出參數值都是以包裝在元素中的方式傳回。元素名稱是輸出參數的名稱。注意,此元素會出現在 <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>