偵錯 CLR 資料庫物件
SQL Server 支援在資料庫中偵錯 Transact-SQL 和 Common Language Runtime (CLR) 物件。在 SQL Server 中偵錯的關鍵層面是設定和使用的簡易性,以及 SQL Server 偵錯程式與 Microsoft Visual Studio 偵錯程式的整合。此外,偵錯可跨語言運作。使用者可以從 Transact-SQL 無接縫地進入 CLR,反之亦然。SQL Server Management Studio 中的 SQL Server 2008 Transact-SQL 偵錯程式無法用於偵錯 Managed 資料庫物件,但您可以使用 Visual Studio 2005 Professional Edition 和 Visual Studio 2005 Team Suite Edition 中的偵錯程式來偵錯物件。在 Visual Studio 中的 Managed 資料物件支援所有通用偵錯功能,例如伺服器上執行之常式內的「逐步執行」和「不進入函式」陳述式。偵錯工具可在偵錯期間,設定中斷點、檢查呼叫堆疊,檢查變數,以及修改變數值。請注意,Visual Studio .NET 2003 可用於 CLR 整合程式發展或偵錯。SQL Server 包含預先安裝的 .NET Framework,而 Visual Studio .NET 2003 無法使用 .NET Framework 2.0 組件。
如需有關使用 Visual Studio 偵錯 Managed 程式碼的詳細資訊,請參閱 Visual Studio 文件集中的<偵錯 Managed 程式碼>主題。
偵錯使用權限及限制
偵錯是一種高度授權的作業,因此在 SQL Server 中只允許 sysadmin 固定伺服器角色的成員執行此作業。
偵錯時會套用下列限制:
偵錯 CLR 常式一次只限於一個偵錯工具執行個體。因為在叫用中斷點時,所有 CLR 程式碼執行都會凍結,在偵錯工具從中斷點繼續前進之前不會繼續執行,所以要套用此限制。但是,您可以在其他連接中繼續偵錯 Transact-SQL。雖然 Transact-SQL 偵錯不會凍結伺服器上的其他執行,但仍會因保留鎖定而讓其他連接等待。
無法偵錯現有連接,只能偵錯新連接。這是因為 SQL Server 需要用戶端及偵錯工具環境的詳細資訊,才能建立連接。
由於上述限制,我們建議應在測試伺服器而不是生產伺服器上偵錯 Transact-SQL 和 CLR 程式碼。
偵錯 Managed 資料庫物件的概觀
SQL Server 中的偵錯遵循每個連接模型。偵錯工具僅會偵測及偵錯其與用戶端之連接的活動。因為偵錯工具的功能不受連接類型的限制,所以可以對表格式資料流 (TDS) 及 HTTP 連接進行偵錯。不過,SQL Server 不允許偵錯現有的連接。偵錯支援在伺服器上執行的常式內的所有通用偵錯功能。偵錯工具與 SQL Server 可透過分散式元件物件模式 (COM) 進行互動。
如需有關偵錯 Managed 預存程序、函數、觸發程序、使用者定義型別和彙總的詳細資訊和案例,請參閱 Visual Studio 文件集中的<SQL Server CLR 整合資料庫偵錯>主題。
[!附註]
必須在 SQL Server 執行個體上啟用 TCP/IP 網路通訊協定,才能針對遠端開發、偵錯和開發使用 Visual Studio。如需有關在伺服器上啟用 TCP/IP 通訊協定的詳細資訊,請參閱<設定用戶端網路通訊協定>。
偵錯 Managed 資料庫物件
開啟 Microsoft Visual Studio 2005、建立新的 SQL Server 專案,然後在 SQL Server 執行個體上建立資料庫的連接。
建立新類型。在 [方案總管] 中以滑鼠右鍵按一下專案,從 [加入新項目] 視窗選取 [加入] 和 [新增項目],再選取 [預存程序]、[使用者定義函數]、[使用者定義型別]、[觸發程序]、[彙總] 或 [類別]。為新類型的來源檔案指定名稱,然後按一下 [加入]。
將新類型的程式碼加入至文字編輯器。如需範例預存程序的範例程式碼,請參閱本主題稍後的章節。
加入測試類型的指令碼。在 [方案總管] 中展開 [TestScripts] 目錄,按兩下 [Test.sql] 以開啟預設的測試指令碼來源檔案。將叫用要偵錯之程式碼的測試指令碼加入至文字編輯器。如需範例指令碼,請參閱下文。
在原始程式碼中放置一或多個中斷點。在文字編輯器中,以滑鼠右鍵在想要偵錯的函數或常式內按一下程式碼行,然後選取 [中斷點] 和 [插入中斷點]。中斷點隨即加入,程式碼行則以紅色反白顯示。
在 [偵錯] 功能表中,選取 [開始偵錯],對專案進行編譯、部署和測試。Test.sql 中的測試指令碼將會執行,並會叫用 Managed 資料庫物件。
當中斷點出現表示指令指標的黃色箭頭時,程式碼執行會暫停,而您可以開始針錯 Managed 資料庫物件。您可以從 [偵錯] 功能表選擇 [不進入函式],將指令指標前進至下一行程式碼。[本機] 視窗是用於觀察目前由指令指標所反白顯示之物件的狀態。變數可以加入至 [監看式] 視窗。在整個偵錯工作階段中都可以觀察受監看變數的狀態,而不只是變數在程式碼行中由指令指標反白顯示時。從 [偵錯] 功能表選取 [繼續],將指令指標前進至下一個中斷點,或者如果沒有中斷點了,就完成常式的執行。
範例
下列範例會將 SQL Server 版本傳回給呼叫者。
C#
using System;
using System.Data;
using System.Data.SqlTypes;
using System.Data.SqlClient;
using Microsoft.SqlServer.Server;
public class StoredProcedures
{
[Microsoft.SqlServer.Server.SqlProcedure]
public static void GetVersion()
{
using(SqlConnection connection = new SqlConnection("context connection=true"))
{
connection.Open();
SqlCommand command = new SqlCommand("select @@version",
connection);
SqlContext.Pipe.ExecuteAndSend(command);
}
}
}
Visual Basic
Imports System
Imports System.Data
Imports System.Data.Sql
Imports System.Data.SqlTypes
Imports Microsoft.SqlServer.Server
Imports System.Data.SqlClient
Partial Public Class StoredProcedures
<Microsoft.SqlServer.Server.SqlProcedure> _
Public Shared Sub GetVersion()
Using connection As New SqlConnection("context connection=true")
connection.Open()
Dim command As New SqlCommand("SELECT @@VERSION", connection)
SqlContext.Pipe.ExecuteAndSend(command)
End Using
End Sub
End Class
下列的測試指令碼會叫用以上定義的 GetVersion 預存程序。
EXEC GetVersion