연습: SQL CLR 사용자 정의 테이블 반환 함수 디버깅

업데이트: 2007년 11월

이 항목은 다음 언어에 적용됩니다.

Edition

Visual Basic

C#

C++

Web Developer

Express

항목이 적용되지 않음 항목이 적용되지 않음 항목이 적용되지 않음 항목이 적용되지 않음

Standard

항목이 적용되지 않음 항목이 적용되지 않음 항목이 적용되지 않음 항목이 적용되지 않음

Pro 및 Team

항목이 적용됨 항목이 적용됨 항목이 적용됨 항목이 적용됨

표의 범례:

항목이 적용됨

해당

항목이 적용되지 않음

해당 없음

항목이 적용되지만 명령은 기본적으로 숨겨짐

명령은 기본적으로 숨겨져 있습니다.

이 예제에서는 SQL CLR UDF(사용자 정의 테이블 반환 함수)의 디버깅 방법을 보여 줍니다.

참고:

표시되는 대화 상자와 메뉴 명령은 실제 설정이나 버전에 따라 도움말에서 설명하는 것과 다를 수 있습니다. 설정을 변경하려면 도구 메뉴에서 설정 가져오기 및 내보내기를 선택합니다. 자세한 내용은 Visual Studio 설정을 참조하십시오.

SQL CLR 사용자 정의 테이블 반환 함수를 디버깅하려면

  1. 새 SQL Server 프로젝트에서 데이터베이스에 대한 연결을 설정합니다. 자세한 내용은 방법: 데이터베이스에 연결을 참조하십시오.

  2. 아래의 첫 번째 예제 섹션에 있는 코드를 사용하여 새 함수를 만들고 이름을 TableOfPrimes.cs로 지정합니다. 자세한 내용은 방법: SQL Server 프로젝트 형식으로 개발을 참조하십시오.

  3. 이 함수를 테스트하는 스크립트를 SELECT 문에 추가합니다. 솔루션 탐색기에서 테스트 스크립트 디렉터리를 마우스 오른쪽 단추로 클릭하고 테스트 스크립트 추가를 클릭한 다음 아래의 두 번째 예제 섹션에 있는 코드를 삽입합니다. 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

참고 항목

작업

방법: CLR SQL Server 사용자 정의 함수 만들기 및 실행

기타 리소스

SQL CLR 데이터베이스 디버깅