사용자 정의 형식 만들기
적용 대상: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 사용자 정의 형식