CREATE TYPE(Transact-SQL)
현재 데이터베이스에 별칭 데이터 형식 또는 사용자 정의 형식을 만듭니다. 별칭 데이터 형식의 구현은 SQL Server 네이티브 시스템 형식을 기반으로 합니다. 사용자 정의 형식은 Microsoft .NET Framework CLR(공용 언어 런타임)에서 어셈블리의 클래스를 통해 구현됩니다. 사용자 정의 형식을 구현에 바인딩하기 위해서는 우선 CREATE ASSEMBLY를 사용하여 해당 형식의 구현을 포함하는 CLR 어셈블리를 SQL Server에 등록해야 합니다.
[!참고]
SQL Server에서는 CLR 코드 실행 기능이 기본적으로 해제되어 있습니다. 관리 코드 모듈을 참조하는 데이터베이스 개체를 생성, 수정 및 삭제할 수 있지만 sp_configure를 사용하여 clr enabled 옵션을 설정해야만 SQL Server에서 이러한 참조가 실행됩니다.
구문
CREATE TYPE [ schema_name. ] type_name
{
FROM base_type
[ ( precision [ , scale ] ) ]
[ NULL | NOT NULL ]
| EXTERNAL NAME assembly_name [ .class_name ]
| AS TABLE ( { <column_definition> | <computed_column_definition> }
[ <table_constraint> ] [ ,...n ] )
} [ ; ]
<column_definition> ::=
column_name <data_type>
[ COLLATE collation_name ]
[ NULL | NOT NULL ]
[
DEFAULT constant_expression ]
| [ IDENTITY [ ( seed ,increment ) ]
]
[ ROWGUIDCOL ] [ <column_constraint> [ ...n ] ]
<data type> ::=
[ type_schema_name . ] type_name
[ ( precision [ , scale ] | max |
[ { CONTENT | DOCUMENT } ] xml_schema_collection ) ]
<column_constraint> ::=
{ { PRIMARY KEY | UNIQUE }
[ CLUSTERED | NONCLUSTERED ]
[
WITH ( <index_option> [ ,...n ] )
]
| CHECK ( logical_expression )
}
<computed_column_definition> ::=
column_name AS computed_column_expression
[ PERSISTED [ NOT NULL ] ]
[
{ PRIMARY KEY | UNIQUE }
[ CLUSTERED | NONCLUSTERED ]
[
WITH ( <index_option> [ ,...n ] )
]
| CHECK ( logical_expression )
]
<table_constraint> ::=
{
{ PRIMARY KEY | UNIQUE }
[ CLUSTERED | NONCLUSTERED ]
( column [ ASC | DESC ] [ ,...n ] )
[
WITH ( <index_option> [ ,...n ] )
]
| CHECK ( logical_expression )
}
<index_option> ::=
{
IGNORE_DUP_KEY = { ON | OFF }
}
인수
schema_name
별칭 데이터 형식이나 사용자 정의 형식이 속한 스키마의 이름입니다.type_name
별칭 데이터 형식 또는 사용자 정의 형식의 이름입니다. 형식 이름은 식별자에 대한 규칙을 따라야 합니다.base_type
SQL Server에서 제공하는 데이터 형식으로 별칭 데이터 형식의 기반이 됩니다. base_type은 sysname이고 기본값은 없으며 다음 값 중 하나일 수 있습니다.bigint
binary(n)
bit
char(n)
date
datetime
datetime2
datetimeoffset
decimal
float
image
int
money
nchar(n)
ntext
numeric
nvarchar(n | max)
real
smalldatetime
smallint
smallmoney
sql_variant
text
time
tinyint
uniqueidentifier
varbinary(n | max)
varchar(n | max)
base_type은 이러한 시스템 데이터 형식 중 하나에 매핑되는 데이터 형식 동의어도 될 수 있습니다.
precision
decimal 또는 numeric에서 소수점 왼쪽과 오른쪽에 기록할 수 있는 십진수의 최대 수를 표시하는 음이 아닌 정수입니다. 자세한 내용은 decimal 및 numeric(Transact-SQL)을 참조하십시오.scale
decimal 또는 numeric에서 소수점 오른쪽에 기록할 수 있는 십진수의 최대 수를 표시하는 음이 아닌 정수이며 전체 자릿수보다 작거나 같아야 합니다. 자세한 내용은 decimal 및 numeric(Transact-SQL)을 참조하십시오.NULL | NOT NULL
해당 형식이 Null 값을 보관할 수 있는지 여부를 지정합니다. 이를 지정하지 않으면 기본값은 NULL입니다.assembly_name
공용 언어 런타임에서 사용자 정의 형식의 구현을 참조하는 SQL Server 어셈블리를 지정합니다. assembly_name은 SQL Server 내 현재 데이터베이스에 있는 기존 어셈블리와 일치해야 합니다.[!참고]
포함된 데이터베이스에서는 EXTERNAL_NAME을 사용할 수 없습니다.
[. class_name ]
사용자 정의 형식을 구현하는 어셈블리 내 클래스를 지정합니다. class_name은 유효한 식별자여야 하며 어셈블리 표시 유형과 함께 어셈블리 내에서 클래스로 존재해야 합니다. class_name은 데이터베이스의 데이터 정렬과 무관하게 대/소문자를 구분하며 해당 어셈블리의 클래스 이름과 정확히 일치해야 합니다. 클래스 작성에 사용되는 프로그래밍 언어가 C#과 같이 네임스페이스 개념을 사용하는 경우 클래스 이름이 대괄호([ ])로 묶은 정식 네임스페이스 이름이 될 수 있습니다. class_name을 지정하지 않을 경우 SQL Server는 type_name과 동일한 것으로 간주합니다.<column_definition>
사용자 정의 테이블 형식의 열을 정의합니다.<데이터 형식>
사용자 정의 테이블 형식에 대한 열의 데이터 형식을 정의합니다. 데이터 형식에 대한 자세한 내용은 데이터 형식(Transact-SQL)을 참조하십시오. 테이블에 대한 자세한 내용은 CREATE TABLE(Transact-SQL)을 참조하십시오.<column_constraint>
사용자 정의 테이블 형식에 대한 열 제약 조건을 정의합니다. 지원되는 제약 조건은 PRIMARY KEY, UNIQUE 및 CHECK입니다. 테이블에 대한 자세한 내용은 CREATE TABLE(Transact-SQL)을 참조하십시오.<computed_column_definition>
계산 열 식을 사용자 정의 테이블 형식의 열로 정의합니다. 테이블에 대한 자세한 내용은 CREATE TABLE(Transact-SQL)을 참조하십시오.<table_constraint>
사용자 정의 테이블 형식의 테이블 제약 조건을 정의합니다. 지원되는 제약 조건은 PRIMARY KEY, UNIQUE 및 CHECK입니다.<index_option>
고유 클러스터형 또는 고유 비클러스터형 인덱스에 여러 행을 삽입하는 작업에서 중복된 키 값이 있는 경우에 대한 오류 응답을 지정합니다. 인덱스 옵션에 대한 자세한 내용은 CREATE INDEX(Transact-SQL)를 참조하십시오.
주의
CREATE TYPE을 사용하여 CLR 사용자 정의 형식을 만드는 경우 데이터베이스 호환성이 90이어야 합니다.
assembly_name에서 참조하는 어셈블리의 클래스는 클래스의 메서드와 함께 SQL Server에서 사용자 정의 형식을 구현하기 위한 모든 요구 사항을 만족시켜야 합니다. 이러한 요구 사항에 대한 자세한 내용은 CLR 사용자 정의 형식을 참조하십시오.
추가적인 고려 사항은 다음과 같습니다.
클래스는 오버로드된 메서드를 가질 수 있지만 Transact-SQL이 아닌 관리 코드 내부에서만 이런 메서드를 호출할 수 있습니다.
assembly_name이 SAFE 또는 EXTERNAL_ACCESS인 경우에는 정적 멤버를 const 또는 readonly로 선언해야 합니다.
데이터베이스 내의 CLR에서 SQL Server에 업로드하는 각 형식에 대한 사용자 정의 형식은 오직 하나만 등록할 수 있습니다. 데이터베이스에 사용자 정의 형식이 존재하는 CLR 형식에 대해 다시 사용자 정의 형식을 만드는 경우 CREATE TYPE에 오류가 발생하면서 실패합니다. 이런 제한은 CLR 형식을 둘 이상의 사용자 정의 형식에 매핑할 수 있는 경우 SQL 형식 확인 과정의 모호성을 피하기 위해 필요합니다.
해당 형식에 void를 반환하는 변경자(mutator) 메서드가 전혀 없으면 CREATE TYPE 문이 실행되지 않습니다.
사용자 정의 형식을 수정하려면 DROP TYPE 문을 사용하여 해당 형식을 삭제한 다음 다시 만들어야 합니다.
public 데이터베이스 역할은 sp_addtype을 사용하여 만든 사용자 정의 형식과는 달리 CREATE TYPE을 사용하여 만든 형식에 대해서는 자동으로 REFERENCES 권한을 받지 못합니다. 이 권한은 별도로 허가해야 합니다.
사용자 정의 테이블 형식에서 column_name <data type>에 사용되는 구조적 사용자 정의 형식은 해당 테이블 유형이 정의된 데이터베이스 스키마 범위의 일부입니다. 데이터베이스 내의 다른 범위에 있는 구조적 사용자 정의 형식에 액세스하려면 두 부분으로 된 이름을 사용하십시오.
사용자 정의 테이블 형식에서 계산 열에 대한 기본 키는 PERSISTED 및 NOT NULL이어야 합니다.
사용 권한
현재 데이터베이스에 대한 CREATE TYPE 권한 및 schema_name에 대한 ALTER 권한이 필요합니다. schema_name을 지정하지 않으면 현재 사용자에 대한 스키마를 결정하는 기본 이름 확인 규칙이 적용됩니다. assembly_name을 지정하면 사용자는 어셈블리나 그에 대한 REFERENCES 권한을 소유해야 합니다.
예
1.varchar 데이터 형식을 기반으로 별칭 유형 만들기
다음 예에서는 시스템이 제공하는 varchar 데이터 형식을 기반으로 별칭 유형을 만드는 방법을 보여 줍니다.
CREATE TYPE SSN
FROM varchar(11) NOT NULL ;
2.사용자 정의 형식 만들기
다음 예에서는 utf8string 어셈블리 내의 utf8string 클래스를 참조하는 Utf8String 형식을 만드는 방법을 보여 줍니다. 형식을 만들기 전에 로컬 데이터베이스에 utf8string 어셈블리를 등록합니다.
CREATE ASSEMBLY utf8string
FROM '\\ComputerName\utf8string\utf8string.dll' ;
GO
CREATE TYPE Utf8String
EXTERNAL NAME utf8string.[Microsoft.Samples.SqlServer.utf8string] ;
GO
3.사용자 정의 테이블 형식 만들기
다음 예에서는 두 개의 열이 있는 사용자 정의 테이블 형식을 만듭니다. 테이블 반환 매개 변수를 만들고 사용하는 방법은 테이블 반환 매개 변수 사용(데이터베이스 엔진)를 참조하십시오.
/* Create a user-defined table type */
CREATE TYPE LocationTableType AS TABLE
( LocationName VARCHAR(50)
, CostRate INT )
GO