다음을 통해 공유


UDT(사용자 정의 형식) 요구 사항

적용 대상:SQL Server

SQL Server에 설치할 UDT(사용자 정의 형식)를 만들 때 몇 가지 중요한 디자인 결정을 내려야 합니다. 대부분의 UDT의 경우 UDT를 구조체로 만드는 것이 권장되지만 클래스로 만드는 것도 옵션입니다. UDT 정의는 SQL Server에 등록되려면 UDT를 만들기 위한 사양을 준수해야 합니다.

UDT를 구현하기 위한 요구 사항

SQL Server에서 실행하려면 UDT가 UDT 정의에서 다음 요구 사항을 구현해야 합니다.

UDT는 Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute지정해야 합니다. System.SerializableAttribute 사용하는 것은 선택 사항이지만 권장됩니다.

  • UDT는 공용 static(Visual Basic에서는Shared) Null 메서드를 만들어 클래스 또는 구조체에서 System.Data.SqlTypes.INullable 인터페이스를 구현해야 합니다. SQL Server는 기본적으로 null 인식입니다. 이는 UDT에서 실행되는 코드가 null 값을 인식할 수 있도록 하는 데 필요합니다.

  • UDT에는 구문 분석을 지원하는 공용 static(또는 Shared) Parse 메서드와 개체의 문자열 표현으로 변환하기 위한 public ToString 메서드가 포함되어야 합니다.

  • 사용자 정의 serialization 형식의 UDT는 System.Data.IBinarySerialize 인터페이스를 구현하고 ReadWrite 메서드를 제공해야 합니다.

  • UDT는 System.Xml.Serialization.IXmlSerializable구현해야 합니다. 또는 표준 serialization을 재정의해야 하는 경우 모든 공용 필드와 속성은 XML 직렬화가 가능하거나 XmlIgnore 특성으로 데코레이트된 형식이어야 합니다.

  • UDT 개체의 serialization은 하나만 있어야 합니다. 직렬화 또는 역직렬화 루틴이 특정 개체의 표현을 둘 이상 인식하는 경우 유효성 검사가 실패합니다.

  • 데이터를 바이트 순서로 비교하려면 SqlUserDefinedTypeAttribute.IsByteOrderedtrue 합니다. IComparable 인터페이스가 구현되지 않고 SqlUserDefinedTypeAttribute.IsByteOrderedfalse경우 바이트 순서 비교가 실패합니다.

  • 클래스에 정의된 UDT에는 인수를 사용하지 않는 공용 생성자가 있어야 합니다. 필요에 따라 오버로드된 클래스 생성자를 더 만들 수 있습니다.

  • UDT는 데이터 요소를 공용 필드 또는 속성 프로시저로 노출해야 합니다.

  • 공용 이름은 128자를 초과할 수 없으며데이터베이스 식별자에 정의된 식별자에 대한 SQL Server 명명 규칙을 준수해야 합니다.

  • sql_variant 열에는 UDT 인스턴스가 포함될 수 없습니다.

  • SQL Server 형식 시스템에서 UDT 간의 상속 계층 구조를 인식하지 못하므로 상속된 멤버는 Transact-SQL 액세스할 수 없습니다. 그러나 클래스를 구성할 때는 상속을 사용할 수 있으며 관리 코드를 사용한 형식 구현에서 이러한 메서드를 호출할 수 있습니다.

  • 클래스 생성자를 제외하고 멤버를 오버로드할 수 없습니다. 오버로드된 메서드를 만드는 경우 어셈블리를 등록하거나 SQL Server에서 형식을 만들 때 오류가 발생하지 않습니다. 오버로드된 메서드의 검색은 형식이 만들어질 때가 아니라 런타임에 발생합니다. 오버로드된 메서드는 호출되지 않는 한 클래스에 존재할 수 있습니다. 오버로드된 메서드를 호출하면 오류가 발생합니다.

  • 모든 static(또는 Shared) 멤버는 상수 또는 읽기 전용으로 선언되어야 합니다. 정적 멤버는 변경할 수 없습니다.

  • SqlUserDefinedTypeAttribute.MaxByteSize 필드가 -1설정된 경우 직렬화된 UDT는 LOB(큰 개체) 크기 제한(현재 2GB)만큼 클 수 있습니다. UDT의 크기는 MaxByteSized 필드에 지정된 값을 초과할 수 없습니다.

참고 항목

서버에서 비교를 수행하는 데는 사용되지 않지만 필요에 따라 단일 메서드 CompareTo노출하는 System.IComparable 인터페이스를 구현할 수 있습니다. 이는 UDT 값을 정확하게 비교하거나 정렬하는 것이 바람직한 상황에서 클라이언트 쪽에서 사용됩니다.

네이티브 serialization

UDT에 적합한 serialization 특성을 선택하는 것은 만들려는 UDT 유형에 따라 달라집니다. Native serialization 형식은 SQL Server가 디스크에 UDT의 효율적인 네이티브 표현을 저장할 수 있도록 하는 간단한 구조를 사용합니다. UDT가 단순하고 다음 형식의 필드만 포함하는 경우 Native 형식을 사용하는 것이 좋습니다.

bool, 바이트, 바이트, 짧은, ushort, int, uint, long , ulong, float, double, , , , , , , , ,

이러한 형식의 필드로 구성된 값 형식은 C#의 struct 같은 Native 형식 또는 Visual Basic .NET에서 알려진 Structure 적합한 후보입니다. 예를 들어 Native serialization 형식으로 지정된 UDT에는 Native 형식으로도 지정된 다른 UDT 필드가 포함될 수 있습니다. UDT 정의가 더 복잡하고 이전 목록에 없는 데이터 형식을 포함하는 경우 대신 UserDefined serialization 형식을 지정해야 합니다.

Native 형식에는 다음과 같은 요구 사항이 있습니다.

  • 형식은 Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute.MaxByteSize값을 지정해서는 안됩니다.

  • 모든 필드를 직렬화할 수 있어야 합니다.

  • UDT가 구조체가 아닌 클래스에 정의된 경우 System.Runtime.InteropServices.StructLayoutAttributeStructLayout.LayoutKindSequential 지정해야 합니다. 이 특성은 데이터 필드의 실제 레이아웃을 제어하며 멤버가 표시되는 순서대로 배치되도록 하는 데 사용됩니다. SQL Server는 이 특성을 사용하여 여러 값을 가진 UDT의 필드 순서를 결정합니다.

Native serialization으로 정의된 UDT의 예는 ADO.NET사용하여 사용자 정의 형식 만들기의 Point UDT를 참조하세요.

사용자 정의 serialization

Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute 특성에 대한 UserDefined 형식 설정을 통해 개발자는 이진 형식을 완전히 제어할 수 있습니다. Format 특성 속성을 UserDefined지정할 때 코드에서 다음 작업을 수행해야 합니다.

  • 선택적 IsByteOrdered 특성 속성을 지정합니다. 기본값은 false.

  • Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute MaxByteSize 속성을 지정합니다.

  • System.Data.Sql.IBinarySerialize 인터페이스를 구현하여 UDT에 대한 ReadWrite 메서드를 구현하는 코드를 작성합니다.

UserDefined serialization으로 정의된 UDT의 예는 ADO.NET사용하여 사용자 정의 형식 만들기에서 통화 UDT를 참조하세요.

참고 항목

UDT 필드는 네이티브 serialization을 사용하거나 인덱싱하기 위해 유지되어야 합니다.

Serialization 특성

특성은 직렬화를 사용하여 UDT의 스토리지 표현을 생성하고 값별로 UDT를 클라이언트에 전송하는 방법을 결정합니다. UDT를 만들 때 Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute 지정해야 합니다. Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute 특성은 클래스가 UDT임을 나타내고 UDT에 대한 스토리지를 지정합니다. SQL Server에는 필요하지 않지만 필요에 따라 Serializable 특성을 지정할 수 있습니다.

Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute 다음과 같은 속성이 있습니다.

UDT의 데이터 형식에 따라 Native 또는 UserDefined수 있는 serialization 형식을 지정합니다.

IsByteOrdered

SQL Server가 UDT에서 이진 비교를 수행하는 방법을 결정하는 Boolean 값입니다.

IsFixedLength

이 UDT의 모든 인스턴스 길이가 같은지 여부를 나타냅니다.

MaxByteSize

인스턴스의 최대 크기(바이트)입니다. UserDefined serialization 형식으로 MaxByteSize 지정해야 합니다. 사용자 정의 serialization이 지정된 UDT의 경우 MaxByteSize 사용자가 정의한 대로 직렬화된 형식으로 UDT의 총 크기를 나타냅니다. MaxByteSize 값은 80001 범위에 있거나 -1 설정하여 UDT가 8,000바이트보다 커야 합니다(총 크기는 최대 LOB 크기를 초과할 수 없음). 문자열이 10자(System.Char)인 UDT를 고려합니다. BinaryWriter를 사용하여 UDT를 serialize하는 경우 serialize된 문자열의 총 크기는 22바이트입니다. 유니코드 UTF-16 문자당 2바이트이며, 최대 문자 수와 이진 스트림 serialize에서 발생하는 2개의 제어 바이트 오버헤드를 곱합니다. 따라서 MaxByteSize값을 결정할 때 serialize된 UDT의 총 크기( 이진 형식으로 serialize된 데이터의 크기와 serialization으로 인해 발생하는 오버헤드)를 고려해야 합니다.

ValidationMethodName

UDT의 인스턴스가 유효한지 여부를 검사하는 데 사용되는 메서드의 이름입니다.

isbyteordered 설정

Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute.IsByteOrdered 속성이 true설정되면 직렬화된 이진 데이터를 정보의 의미 체계 순서 지정에 사용할 수 있습니다. 따라서 바이트 순서 UDT 개체의 각 인스턴스에는 직렬화된 표현이 하나만 있을 수 있습니다. SQL Server에서 직렬화된 바이트의 비교 작업을 수행하는 경우 결과는 관리 코드에서 동일한 비교 작업이 수행된 경우와 동일해야 합니다. IsByteOrdered true설정되는 경우에도 다음과 같은 기능이 지원됩니다.

  • 이 형식의 열에 인덱스를 만드는 기능입니다.

  • 이 형식의 열에 대한 CHECKUNIQUE 제약 조건뿐만 아니라 기본 키와 외신 키를 만드는 기능입니다.

  • Transact-SQL ORDER BY, GROUP BYPARTITION BY 절을 사용하는 기능입니다. 이러한 경우 형식의 이진 표현을 사용하여 순서를 확인합니다.

  • Transact-SQL 문에서 비교 연산자를 사용하는 기능입니다.

  • 이 형식의 계산 열을 유지하는 기능

IsByteOrdered true설정된 경우 NativeUserDefined serialization 형식은 모두 다음 비교 연산자를 지원합니다.

  • 같음(=)
  • 같지 않음(!=)
  • 보다 큼(>)
  • 미만(<)
  • 보다 크거나 같음(>=)
  • 작거나 같음(<=)

Null 허용 여부 구현

어셈블리의 특성을 올바르게 지정하는 것 외에도 클래스는 null 허용 여부도 지원해야 합니다. SQL Server에 로드된 UDT는 null을 인식하지만 UDT가 null 값을 인식하려면 클래스가 INullable 인터페이스를 구현해야 합니다. 자세한 내용과 UDT에서 null 허용을 구현하는 방법의 예는 ADO.NET사용하여 사용자 정의 형식 만들기를 참조하세요.

문자열 변환

UDT와의 문자열 변환을 지원하려면 클래스에 Parse 메서드와 ToString 메서드를 제공해야 합니다. Parse 메서드를 사용하면 문자열을 UDT로 변환할 수 있습니다. static(또는 Visual Basic에서는 Shared)로 선언하고 System.Data.SqlTypes.SqlString형식의 매개 변수를 사용해야 합니다. ParseToString 메서드를 구현하는 방법에 대한 자세한 내용과 예제는 ADO.NET사용하여 사용자 정의 형식 만들기를 참조하세요.

XML serialization

UDT는 XML serialization에 대한 계약을 준수하여 xml 데이터 형식과의 변환을 지원해야 합니다. System.Xml.Serialization 네임스페이스에는 개체를 XML 형식 문서 또는 스트림으로 serialize하는 데 사용되는 클래스가 포함되어 있습니다. xml serialization 및 역직렬화에 대한 사용자 지정 서식을 제공하는 IXmlSerializable 인터페이스를 사용하여 xml serialization을 구현하도록 선택할 수 있습니다.

UDT에서 xml로의 명시적 변환을 수행하는 것 외에도 XML serialization을 사용하면 다음을 수행할 수 있습니다.

  • xml 데이터 형식으로 변환한 후 UDT 인스턴스 값보다 XQuery를 사용합니다.

  • SQL Server에서 네이티브 XML 웹 서비스와 함께 매개 변수가 있는 쿼리 및 웹 메서드에서 UDT를 사용합니다.

  • UDT를 사용하여 대량의 XML 데이터 로드를 받습니다.

  • UDT 열이 있는 테이블을 포함하는 DataSets를 직렬화합니다.

UDT는 FOR XML 쿼리에서 직렬화되지 않습니다. UDT의 XML serialization을 표시하는 FOR XML 쿼리를 실행하려면 각 UDT 열을 SELECT 문의 xml 데이터 형식으로 명시적으로 변환합니다. 열을 varbinary, varchar 또는 nvarchar로 명시적으로 변환할 수도 있습니다.