如何偵錯 CLR 資料庫物件
適用於:SQL Server
SQL Server 支援在資料庫中偵錯 Transact-SQL 及通用語言執行平台 (CLR) 物件。 在 SQL Server 中偵錯的關鍵在於容易設定和使用,以及 SQL Server 偵錯程式與 Microsoft Visual Studio 偵錯程式的整合。 此外,偵錯可跨語言運作。 使用者可以順暢地從 Transact-SQL 進入 CLR 物件,反之亦然。
SQL Server Management Studio 中的 Transact-SQL 調試程式無法用來偵錯 Managed 資料庫物件,但您可以使用 Visual Studio 中的調試程式來偵錯物件。 Visual Studio 中的 Managed 資料庫物件偵錯支援所有常見的偵錯功能,例如在伺服器上執行的例程內,逐步執入 和 逐步越過 語句。 偵錯工具可在偵錯期間,設定中斷點、檢查呼叫堆疊,檢查變數,以及修改變數值。
偵錯許可權和限制
偵錯是一種高度授權的作業,因此在 SQL Server 中只有 sysadmin 固定伺服器角色的成員才能執行此作業。
偵錯時會套用下列限制:
偵錯 CLR 常式一次只限於一個偵錯工具執行個體。 此限制適用,因為當中斷點被觸發時,所有 CLR 程式碼執行都會凍結,且執行不會繼續,直到調試器不從中斷點繼續。 但是,您可以在其他連接中繼續偵錯 Transact-SQL。 雖然 Transact-SQL 除錯不會凍結伺服器上的其他執行,但它可能會因為持有鎖而造成其他連線等候。
現有的連接無法偵錯,只有新的連線,因為 SQL Server 需要客戶端和調試程式環境的相關信息,才能建立連線。
因此,建議您在測試伺服器上偵錯 Transact-SQL 和 CLR 程式代碼,而不是在生產伺服器上進行偵錯。
概觀
SQL Server 中的偵錯遵循基於每個連接模型。 調試程式只能在附加的用戶端連線上偵測及偵錯活動。 由於調試程式的功能不受連線類型限制,因此可以偵錯表格式數據流 (TDS) 和 HTTP 連線。 不過,SQL Server 不允許偵錯現有的連線。 偵錯支援在伺服器上執行的常式內的所有通用偵錯功能。 偵錯工具與 SQL Server 透過分散式元件物件模型 (COM) 進行互動。
關於偵錯受控預存程序、函數、觸發程序、使用者定義型別和彙總,如需其詳細資訊和案例,請參閱 Visual Studio 文件集中的 SQL Server CLR 整合資料庫偵錯主題。
務必在 SQL Server 執行個體上啟用 TCP/IP 網路通訊協定,才能夠使用 Visual Studio 進行遠端開發、偵錯和開發。 如需在伺服器上啟用 TCP/IP 通訊協定的詳細資訊,請參閱設定用戶端通訊協定。
偵錯步驟
請使用下列步驟,在 Microsoft Visual Studio 中偵錯 CLR 資料庫物件:
開啟 Microsoft Visual Studio 並建立新的 SQL Server 專案。 您可以使用隨附於 Visual Studio 的 SQL LocalDB 執行個體。
建立新的 SQL CLR 類型 (C#):
- 在 [方案總管]中,以滑鼠右鍵按一下專案並選取 [新增]、[新增項目...]。
- 從 [新增專案] 的視窗中,選取 [SQL CLR C# 預存程序]、[SQL CLR C# 使用者定義型別函數]、[SQL CLR C# 使用者定義型別]、[SQL CLR C# 觸發程序]、[SQL CLR C# 彙總值] 或 [類別]。
- 為新類型的來源檔案指定名稱,然後選取 [加入]。
將新類型的程式碼加入至文字編輯器。 如需範例預存程序的程式碼範例,請參閱本文稍後的〈範例〉一節。
加入測試類型的指令碼:
- 在 [方案總管]中,以滑鼠右鍵按一下專案節點並選取 [加入]、[指令碼...]。
- 在 [新增項目]視窗中,選取 [指令碼] (不在組建中),然後指定名稱,例如 。 選取 [新增] 按鈕。
- 在 [方案總管]中,按兩下 節點以開啟預設的測試指令碼來源檔案。
- 將測試指令碼 (用來叫用要偵錯的程式碼) 加入至文字編輯器。 如需指令碼範例,請參閱下一節中的範例。
在原始程式碼中放置一或多個中斷點。 在您要偵錯的函數或常式上以滑鼠右鍵按一下文字編輯器中的程式碼。 選取 [中斷點]、[插入中斷點]。 中斷點隨即加入,程式碼行則以紅色反白顯示。
在 [偵錯]功能表中,請選取 [開始偵錯],對該專案進行編譯、部署和測試。 系統會執行
Test.sql
中的測試指令碼,並叫用受控資料庫物件。在黃色箭號 (指定指令指標) 出現在中斷點時,程式碼執行會暫停。 您便可以偵錯您的受控資料庫物件:
- 您可以從 [偵錯] 功能表選擇 [不進入函數],將指令指標前進至下一行程式碼。
- [本機]視窗是用於觀察目前由指令指標反白顯示物件的狀態。
- 將變數新增至 [監看式]視窗。 在偵錯會話中,您可以觀察受監控變數的狀態,即使變數不在指令指標當前高亮顯示的程式碼行中,您也可以觀察它們。
- 從 [偵錯] 功能表選取 [繼續],將指令指標前進至下一個中斷點,或者如果沒有中斷點,就完成該常式的執行。
程式碼範例
下列 C# 範例會將 SQL Server 版本傳回給呼叫端。
using System.Data.SqlClient;
using Microsoft.SqlServer.Server;
public class StoredProcedures
{
[Microsoft.SqlServer.Server.SqlProcedure]
public static void GetVersion()
{
using (var connection = new SqlConnection("context connection=true"))
{
connection.Open();
var command = new SqlCommand("select @@version", connection);
SqlContext.Pipe.ExecuteAndSend(command);
}
}
}
測試指令碼範例
下列測試指令碼顯示如何叫用上個範例中定義的 GetVersion
預存程序。
EXECUTE GetVersion;