共用方式為


逐步解說:偵錯 SQL CLR 使用者定義的資料表值函式

更新:2007 年 11 月

這個主題適用於:

版本

Visual Basic

C#

C++

Web Developer

Express 版

標題不適用於 標題不適用於 標題不適用於 標題不適用於

Standard 版

標題不適用於 標題不適用於 標題不適用於 標題不適用於

Pro/Team 版

標題適用於 標題適用於 標題適用於 標題適用於

表格圖例:

標題適用於

套用

標題不適用於

不套用

預設會套用主題但隱藏命令

預設隱藏的命令。

這個範例將示範如何偵錯 SQL CLR 使用者定義的資料表值函式 (UDF)。

注意事項:

您所看見的對話方塊與功能表命令可能會與 [說明] 中所描述的有所不同,視您所使用的設定或版本而定。若要變更設定,請從 [工具] 功能表中選擇 [匯入和匯出設定]。如需詳細資訊,請參閱 Visual Studio 設定

若要偵錯 SQL CLR 使用者定義的資料表值函式

  1. 在新的 SQL Server 專案中,建立與資料庫的連線。如需詳細資訊,請參閱 HOW TO:連接資料庫

  2. 使用下列第一個範例區段中的程式碼來建立新函式,並且將其命名為 TableOfPrimes.cs。如需詳細資訊,請參閱 HOW TO:使用 SQL Server 專案類型開發

  3. 藉由將指令碼包含在 SELECT 陳述式中,加入能夠測試函式的指令碼。在 [方案總管] 中,以滑鼠右鍵按一下 [TestScripts] 目錄,再按 [加入測試指令碼],然後插入下列第二個範例區段中的程式碼。使用名稱 TestPrime.sql 來儲存檔案。以滑鼠右鍵按一下這個檔案名稱,再按 [設定為預設偵錯指令碼]。

  4. 在 TableOfPrimes.cs 中設定中斷點,然後在 [偵錯] 功能表上按一下 [啟動],對專案進行編譯、部署和單元測試。當中斷點上出現以黃色箭頭表示的指令指標時,即表示您正在偵錯 SQL CLR 程式碼。

  5. 嘗試不同的偵錯功能。

    1. 在 [偵錯] 功能表上,重複按 [逐步執行] 觀察函式的逐行執行。

    2. 當您逐步執行函式時,可以使用 [區域變數] 和 [監看式] 視窗來觀察不同成員的值。

    3. 再一次按 [繼續],以完成此函式的偵錯動作。

    4. 在 [輸出] 視窗的 [顯示輸出來源] 下拉式清單中,選取 [資料庫輸出],然後就可以觀察 TestPrimes.sql 指令碼中兩個查詢的執行結果。

範例

以下是讀取事件日誌的程式碼。

using System;
using System.Data;
using System.Data.Sql;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
using System.Collections;

public partial class UserDefinedFunctions
{
    struct primeIndex
    {
        public int n;
        public int p;
        public primeIndex(int n, int p)  
        { 
            this.n = n; this.p = p;
        }
    }

    static bool isPrime(int p)
    {
        if (p < 2) return false;
        if (p == 2) return true;
        if (p % 2 == 0) return false;
        for (int d = 3; d * d <= p; d+=2)
        {
            if (p % d == 0) return false;
        }
        return true;
    }

    static int nextPrime(int p)
    {
        int result = p + 1;
        while (!isPrime(result)) result++;
        return result;
    }

    [SqlFunction(FillRowMethodName = "Fill", TableDefinition = "n int,p int,est float")]
    public static IEnumerable TableOfPrimes(int n)
    {
        int p = 1;
        for (int i = 1; i <= n; i++)
        {
            p = nextPrime(p);
            yield return new primeIndex(i, p);
        }
    }

    private static void Fill(object source, out int n, out int p, out SqlDouble est)
    {
        primeIndex pi = (primeIndex)source;
        n = pi.n;
        p = pi.p;
        if (n <5)
            est = SqlDouble.Null;
        else
        {
            double log = Math.Log(n);
            double loglog = Math.Log(log);
            est = n * (log + loglog - 1 + loglog / log - 2 / log); 
        }
    }
}

此為呼叫函式的測試指令碼。

SELECT n,p,est FROM dbo.TableOfPrimes(50)

SELECT TOP 10 n, p, est, est/p AS factor FROM dbo.TableOfPrimes(500) ORDER BY factor DESC

SELECT TOP 10 n, p, est, est/p AS factor FROM dbo.TableOfPrimes(1000) WHERE n>500 ORDER BY factor DESC

請參閱

工作

HOW TO:建立及執行 CLR SQL Server 使用者定義函式

其他資源

SQL CLR 資料庫偵錯