연습: SQL CLR 사용자 정의 테이블 반환 함수 디버깅
업데이트: 2007년 11월
이 항목은 다음 언어에 적용됩니다.
Edition |
Visual Basic |
C# |
C++ |
Web Developer |
---|---|---|---|---|
Express |
![]() |
![]() |
![]() |
![]() |
Standard |
![]() |
![]() |
![]() |
![]() |
Pro 및 Team |
![]() |
![]() |
![]() |
![]() |
표의 범례:
![]() |
해당 |
![]() |
해당 없음 |
![]() |
명령은 기본적으로 숨겨져 있습니다. |
이 예제에서는 SQL CLR UDF(사용자 정의 테이블 반환 함수)의 디버깅 방법을 보여 줍니다.
![]() |
---|
표시되는 대화 상자와 메뉴 명령은 실제 설정이나 버전에 따라 도움말에서 설명하는 것과 다를 수 있습니다. 설정을 변경하려면 도구 메뉴에서 설정 가져오기 및 내보내기를 선택합니다. 자세한 내용은 Visual Studio 설정을 참조하십시오. |
SQL CLR 사용자 정의 테이블 반환 함수를 디버깅하려면
새 SQL Server 프로젝트에서 데이터베이스에 대한 연결을 설정합니다. 자세한 내용은 방법: 데이터베이스에 연결을 참조하십시오.
아래의 첫 번째 예제 섹션에 있는 코드를 사용하여 새 함수를 만들고 이름을 TableOfPrimes.cs로 지정합니다. 자세한 내용은 방법: SQL Server 프로젝트 형식으로 개발을 참조하십시오.
이 함수를 테스트하는 스크립트를 SELECT 문에 추가합니다. 솔루션 탐색기에서 테스트 스크립트 디렉터리를 마우스 오른쪽 단추로 클릭하고 테스트 스크립트 추가를 클릭한 다음 아래의 두 번째 예제 섹션에 있는 코드를 삽입합니다. TestPrime.sql이라는 이름으로 파일을 저장합니다. 파일 이름을 마우스 오른쪽 단추로 클릭하고 기본 디버그 스크립트로 설정을 클릭합니다.
TableOfPrimes.cs에 중단점을 설정한 다음 디버그 메뉴에서 시작을 클릭하여 프로젝트를 컴파일, 배포 및 단위 테스트합니다. 중단점에 노란색 화살표로 표시된 지시 포인터가 나타나면 SQL CLR 코드가 디버깅되고 있는 것입니다.
다른 디버깅 기능을 사용해 봅니다.
디버그 메뉴에서 한 단계씩 코드 실행을 반복하여 클릭하면서 함수가 한 줄씩 실행되는 과정을 조사할 수 있습니다.
함수를 단계별로 실행할 때는 지역 및 조사식 창에서 다른 멤버의 값을 확인할 수 있습니다.
함수 디버깅을 마치려면 계속을 다시 클릭합니다.
출력 창의 다음에서 출력 보기 드롭다운 목록에서 데이터베이스 출력을 선택하면 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 사용자 정의 함수 만들기 및 실행