다음을 통해 공유


사용자 정의 형식 만들기

적용 대상:SQL Server

SQL Server에 설치할 수 있는 UDT(사용자 정의 형식)를 만들려면 먼저 UDT를 만들기 위한 사양을 준수하는 C# 또는 Visual Basic .NET과 같이 지원되는 .NET Framework 프로그래밍 언어 중 하나로 클래스를 만들어야 합니다. 그런 다음, 클래스를 SQL Server에 로드할 수 있는 DLL(동적 연결 라이브러리)로 컴파일할 수 있습니다. Visual Studio를 사용하여 UDT를 만들고 배포할 수도 있습니다.

CLR(공용 언어 런타임) 코드를 실행하는 기능은 SQL Server에서 기본적으로 OFF로 설정됩니다. 다음 Transact-SQL 문과 같이 sp_configure 시스템 저장 프로시저를 사용하여 CLR을 사용하도록 설정할 수 있습니다.

EXECUTE sp_configure 'clr enabled', 1;
RECONFIGURE;

이 섹션에서는

기사 묘사
UDT(사용자 정의 형식) 요구 사항 사용자 정의 형식 코딩에 대한 요구 사항을 설명합니다.
ADO.NET 사용하여 사용자 정의 형식 만들기 사용자 정의 형식을 만드는 것과 관련된 코딩 방법을 설명합니다.

예제

다음 코드 목록은 Point UDT를 정의합니다. ADO.NET사용하여 사용자 정의 형식 만들기에 자세히 설명되어 있습니다.

  • C#
  • Visual Basic .NET
using System;
using System.Data;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
using System.Text;

[Serializable]
[Microsoft.SqlServer.Server.SqlUserDefinedType(Format.Native,
     IsByteOrdered=true, ValidationMethodName = "ValidatePoint")]
public struct Point : INullable
{
    private bool is_Null;
    private Int32 _x;
    private Int32 _y;

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

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

    // Use StringBuilder to provide string representation of UDT.
    public override string ToString()
    {
        // Since InvokeIfReceiverIsNull defaults to 'true'
        // this test is unnecessary if Point is only being called
        // from SQL.
        if (this.IsNull)
            return "NULL";
        else
        {
            StringBuilder builder = new StringBuilder();
            builder.Append(_x);
            builder.Append(",");
            builder.Append(_y);
            return builder.ToString();
        }
    }

    [SqlMethod(OnNullCall = false)]
    public static Point Parse(SqlString s)
    {
        // With OnNullCall=false, this check is unnecessary if
        // Point only called from SQL.
        if (s.IsNull)
            return Null;

        // Parse input string to separate out points.
        Point pt = new Point();
        string[] xy = s.Value.Split(",".ToCharArray());
        pt.X = Int32.Parse(xy[0]);
        pt.Y = Int32.Parse(xy[1]);

        // Call ValidatePoint to enforce validation
        // for string conversions.
        if (!pt.ValidatePoint())
            throw new ArgumentException("Invalid XY coordinate values.");
        return pt;
    }

    // X and Y coordinates exposed as properties.
    public Int32 X
    {
        get
        {
            return this._x;
        }
        // Call ValidatePoint to ensure valid range of Point values.
        set
        {
            Int32 temp = _x;
            _x = value;
            if (!ValidatePoint())
            {
                _x = temp;
                throw new ArgumentException("Invalid X coordinate value.");
            }
        }
    }

    public Int32 Y
    {
        get
        {
            return this._y;
        }
        set
        {
            Int32 temp = _y;
            _y = value;
            if (!ValidatePoint())
            {
                _y = temp;
                throw new ArgumentException("Invalid Y coordinate value.");
            }
        }
    }

    // Validation method to enforce valid X and Y values.
    private bool ValidatePoint()
    {
        // Allow only zero or positive integers for X and Y coordinates.
        if ((_x >= 0) && (_y >= 0))
        {
            return true;
        }
        else
        {
            return false;
        }
    }

    // Distance from 0 to Point method.
    [SqlMethod(OnNullCall = false)]
    public Double Distance()
    {
        return DistanceFromXY(0, 0);
    }

    // Distance from Point to the specified point method.
    [SqlMethod(OnNullCall = false)]
    public Double DistanceFrom(Point pFrom)
    {
        return DistanceFromXY(pFrom.X, pFrom.Y);
    }

    // Distance from Point to the specified x and y values method.
    [SqlMethod(OnNullCall = false)]
    public Double DistanceFromXY(Int32 iX, Int32 iY)
    {
        return Math.Sqrt(Math.Pow(iX - _x, 2.0) + Math.Pow(iY - _y, 2.0));
    }
}
  • CLR 사용자 정의 형식