연습: SQL CLR 사용자 정의 형식 디버깅

이 항목은 다음 버전에 적용됩니다.

Edition

Visual Basic

C#

C++

Web Developer

Express

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

Standard

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

Pro 및 Team

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

이 예제에서는 SQL CLR(SQL Server 공용 언어 런타임) 사용자 정의 형식을 디버깅하는 방법을 보여 줍니다. 먼저 AdventureWorks 샘플 데이터베이스에 새 SQL CLR 형식을 만듭니다. 이 형식은 테이블 정의, INSERT 문 및 SELECT 문에 순서대로 사용됩니다.

SQL CLR 개체를 디버깅하려고 할 때 "사용자가 취소했습니다."라는 메시지가 나타나면 Visual Studio를 실행하는 컴퓨터와 SQL Server를 실행하는 컴퓨터를 모두 수동으로 구성해야 합니다. 자세한 내용은 방법: Transact-SQL 및 SQL CLR 디버깅을 사용하도록 컴퓨터 구성을 참조하십시오.

참고

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

CLR SQL 사용자 정의 형식을 디버깅하려면

  1. 새 SQL CLR 프로젝트에서 AdventureWorks 샘플 데이터베이스에 대한 연결을 설정합니다. 자세한 내용은 How to: Connect to a Database을 참조하십시오.

  2. 아래의 첫 번째 예제 섹션에 있는 코드를 사용하여 새 형식을 만들고 이름을 Point.cs로 지정합니다. 자세한 내용은 How to: Develop with the SQL Server Project Type을 참조하십시오.

  3. 형식을 테스트하는 스크립트를 추가합니다. 솔루션 탐색기에서 테스트 스크립트 디렉터리를 마우스 오른쪽 단추로 클릭하고 테스트 스크립트 추가를 클릭한 다음 아래의 두 번째 예제 섹션에 있는 코드를 삽입합니다. Point.sql이라는 이름으로 파일을 저장합니다. 파일 이름을 마우스 오른쪽 단추로 클릭하고 기본 디버그 스크립트로 설정을 클릭합니다.

  4. 중단점을 추가합니다.

    1. 서버 탐색기형식 폴더에서 Point를 엽니다.

    2. 형식 내의 제어 흐름을 살펴볼 수 있도록 각 메서드 내에 중단점을 삽입합니다.

  5. 디버그 메뉴에서 시작을 선택하여 프로젝트를 컴파일, 배포 및 단위 테스트합니다. 중단점에 노란색 화살표로 표시된 지시 포인터가 나타나면 함수가 디버깅되고 있는 것입니다.

  6. 다른 디버깅 기능을 사용해 봅니다.

    1. Point.sql의 스크립트에 있는 각 INSERT 문에 대해 Parse 메서드가 한 번씩 실행됩니다. 디버그 메뉴에서 한 단계씩 코드 실행을 반복하여 클릭하면서 메서드가 콜론으로 구분된 숫자 쌍을 Point 개체로 변환하는 과정을 살펴볼 수 있습니다.

    2. 지역 창에서 현재 빌드 중인 Point를 포함하는 pt 변수를 엽니다.

    3. 텍스트 편집기에서 pt 변수를 두 번 클릭하여 선택합니다. pt 변수를 끌어 조사식 창의 임의의 위치에 놓습니다. 그러면 조사 변수 목록에 pt가 추가되어 Point가 빌드될 때 이를 살펴볼 수 있습니다.

    4. 클래스를 여러 번 단계별로 실행하고 INSERT와 SELECT의 경로 차이점을 확인합니다.

    5. 함수 디버깅을 마치려면 계속을 다시 누릅니다.

예제

다음은 이 샘플에서 사용하는 형식을 정의하는 코드입니다. 이 코드는 Points라는 테이블을 만들어 행을 삽입하고 테이블 내용을 출력합니다. 테이블을 만들고 액세스하는 중에 배치 명령 GO를 포함할 필요가 없습니다. 실제로 Visual Studio 2005에서는 GO를 잘못된 SQL 명령으로 해석합니다.

using System;
using System.Data.Sql;
using System.Data.SqlTypes;
using System.Runtime.Serialization;

[Serializable, SqlUserDefinedTypeAttribute(Format.Native)]
public struct Point: INullable
{
    private bool m_isNull;
    private double m_x;
    private double m_y;

    public bool IsNull {
        get { return (m_isNull); }
    }

    public override string ToString()
    {
        if (this.IsNull) { return "NULL"; }
        else { return this.m_x + ":" + this.m_y; }
    }

    public static Point Parse(SqlString s)
    {
        if (s.IsNull) { return Null; }
        else
        {
            // Parse input string here to separate out points:
            Point pt = new Point();
            string str = Convert.ToString(s);
            string[] xy = str.Split(':');

            pt.X = Convert.ToDouble(xy[0]);
            pt.Y = Convert.ToDouble(xy[1]);
            return (pt);
        }
    }

    public static Point Null
    {
        get
        {
            Point pt = new Point();
            pt. m_isNull = true;
            return (pt);
        }
    }

    public double X
    {
        get { return (this.m_x); }
        set { m_x = value; }
    }

    public double Y
    {
        get { return (this.m_y); }
        set { m_y = value; }
    }
}

다음은 함수를 호출하는 테스트 스크립트입니다.

CREATE TABLE dbo.Points ( 
            ID int IDENTITY(1,1) PRIMARY KEY, 
            Pnt Point) 
INSERT INTO dbo.Points (Pnt) VALUES (CONVERT(Point, '3:4')) 
INSERT INTO dbo.Points (Pnt) VALUES (CONVERT(Point, '-1:5')) 
INSERT INTO dbo.Points (Pnt) VALUES (CAST ('1:99' AS Point)) 
SELECT ID, 
        Pnt.ToString() as StringPoint, 
        Pnt.X as X, 
        Pnt.Y as Y      
FROM dbo.Points

참고 항목

작업

방법: 공용 언어 런타임 통합을 사용하여 SQL Server 사용자 정의 형식 만들기 및 실행