다음을 통해 공유


CREATE TYPE(Transact-SQL)

SQL Server 또는 Azure SQL 데이터베이스에서 현재 데이터베이스에 별칭 데이터 형식 또는 사용자 정의 형식을 만듭니다. 별칭 데이터 형식의 구현은 SQL Server 네이티브 시스템 형식을 기반으로 합니다. 사용자 정의 형식은 Microsoft .NET Framework CLR(공용 언어 런타임)에서 어셈블리의 클래스를 통해 구현됩니다. 사용자 정의 형식을 구현에 바인딩하기 위해서는 우선 CREATE ASSEMBLY를 사용하여 해당 형식의 구현을 포함하는 CLR 어셈블리를 SQL Server에 등록해야 합니다.

SQL Server에서는 CLR 코드 실행 기능이 기본적으로 해제되어 있습니다. 관리 코드 모듈을 참조하는 데이터베이스 개체를 생성, 수정 및 삭제할 수 있지만 sp_configure를 사용하여 clr enabled 옵션을 설정해야만 SQL Server에서 이러한 참조가 실행됩니다.

적용 대상: SQL Server(SQL Server 2008 - 현재 버전), Azure SQL 데이터베이스(최초 릴리스 - 현재 릴리스)

항목 링크 아이콘 Transact-SQL 구문 표기 규칙

구문

Disk-Based Type Syntax
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 }
}

Memory-Optimized Table Type Syntax
CREATE TYPE [schema_name. ] type_name
AS TABLE ( { <column_definition> }
    |  [ <table_constraint> ] [ ,... n ]
    | [ <table_index> ] [ ,... n ]
    } )
    [ WITH ( <table_option> [ ,... n ] ) ]

 [ ; ]

<column_definition> ::=
column_name <data_type>
    [ COLLATE collation_name ]
   [ NULL | NOT NULL ]
    [
      [ IDENTITY [ (1 , 1) ]
    ]
    [ <column_constraint> [ ... n ] ]
    [ <column_index> ]

<data type> ::=
 [type_schema_name . ] type_name [ (precision [ , scale ]) ]

<column_constraint> ::=
{ PRIMARY KEY { NONCLUSTERED HASH WITH (BUCKET_COUNT = bucket_count) | NONCLUSTERED } }

< table_constraint > ::=
{ PRIMARY KEY { NONCLUSTERED HASH (column [ ,... n ] ) WITH (BUCKET_COUNT = bucket_count) |  NONCLUSTERED  (column [ ASC | DESC ] [ ,... n ] )  } }

<column_index> ::=
  INDEX index_name
{ { [ NONCLUSTERED ] HASH WITH (BUCKET_COUNT = bucket_count) | NONCLUSTERED } }

< table_index > ::=
  INDEX constraint_name
{ { [ NONCLUSTERED ] HASH (column [ ,... n ] ) WITH (BUCKET_COUNT = bucket_count) |  [NONCLUSTERED]  (column [ ASC | DESC ] [ ,... n ] )} }

<table_option> ::=
{
    [MEMORY_OPTIMIZED = {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 2008 - SQL Server 2014.

    공용 언어 런타임에서 사용자 정의 형식의 구현을 참조하는 SQL Server 어셈블리를 지정합니다. assembly_name 은 SQL Server 내 현재 데이터베이스에 있는 기존 어셈블리와 일치해야 합니다.

    참고

    포함된 데이터베이스에서는 EXTERNAL_NAME을 사용할 수 없습니다.

  • [. class_name ]

    적용 대상: SQL Server 2008 - SQL Server 2014.

    사용자 정의 형식을 구현하는 어셈블리 내 클래스를 지정합니다. class_name은 유효한 식별자여야 하며 어셈블리 표시 유형과 함께 어셈블리 내에서 클래스로 존재해야 합니다. class_name은 데이터베이스의 데이터 정렬과 무관하게 대/소문자를 구분하며 해당 어셈블리의 클래스 이름과 정확히 일치해야 합니다. 클래스 작성에 사용되는 프로그래밍 언어가 C#과 같이 네임스페이스 개념을 사용하는 경우 클래스 이름이 대괄호([ ])로 묶은 정식 네임스페이스 이름이 될 수 있습니다. class_name을 지정하지 않을 경우 SQL Server는 type_name과 동일한 것으로 간주합니다.

  • <column_definition>
    사용자 정의 테이블 형식의 열을 정의합니다.

  • <데이터 형식>
    사용자 정의 테이블 형식에 대한 열의 데이터 형식을 정의합니다. 데이터 형식에 대한 자세한 내용은 데이터 형식(Transact-SQL)을 참조하십시오. 테이블에 대한 자세한 내용은 CREATE TABLE(SQL Server)을 참조하십시오.

  • <column_constraint>
    사용자 정의 테이블 형식에 대한 열 제약 조건을 정의합니다. 지원되는 제약 조건은 PRIMARY KEY, UNIQUE 및 CHECK입니다. 테이블에 대한 자세한 내용은 CREATE TABLE(SQL Server)을 참조하십시오.

  • <computed_column_definition>
    계산 열 식을 사용자 정의 테이블 형식의 열로 정의합니다. 테이블에 대한 자세한 내용은 CREATE TABLE(SQL Server)을 참조하십시오.

  • <table_constraint>
    사용자 정의 테이블 형식의 테이블 제약 조건을 정의합니다. 지원되는 제약 조건은 PRIMARY KEY, UNIQUE 및 CHECK입니다.

  • <index_option>
    고유 클러스터형 또는 고유 비클러스터형 인덱스에 여러 행을 삽입하는 작업에서 중복된 키 값이 있는 경우에 대한 오류 응답을 지정합니다. 인덱스 옵션에 대한 자세한 내용은 CREATE INDEX(Transact-SQL)를 참조하십시오.

  • INDEX
    CREATE TABLE 문의 일부로 열 및 테이블 인덱스를 지정해야 합니다. CREATE INDEX 및 DROP INDEX는 메모리 액세스에 최적화된 테이블에서 지원되지 않습니다.

  • MEMORY_OPTIMIZED

    적용 대상: SQL Server 2014 - SQL Server 2014.

    테이블 형식이 메모리 액세스에 최적화된 형식인지 여부를 나타냅니다. 이 옵션은 기본적으로 해제됩니다. 테이블(형식)은 메모리 액세스에 최적화된 테이블(형식)이 아닙니다. 메모리 액세스에 최적화된 테이블 형식은 메모리 액세스에 최적화된 사용자 테이블입니다. 디스크에 저장된 스키마는 다른 사용자 테이블과 비슷합니다. 메모리 액세스에 최적화된 테이블 형식은 고유하게 컴파일된 저장 프로시저에서만 액세스할 수 있습니다.

  • BUCKET_COUNT

    적용 대상: SQL Server 2014 - SQL Server 2014.

    해시 인덱스에서 만들어야 하는 버킷 수를 나타냅니다. 해시 인덱스에서 BUCKET_COUNT의 최대값은 1,073,741,824입니다. 버킷 수에 대한 자세한 내용은 해시 인덱스에 대한 올바른 버킷 수 결정를 참조하십시오. bucket_count는 필수 인수입니다.

  • HASH

    적용 대상: SQL Server 2014 - SQL Server 2014

    HASH 인덱스가 만들어졌음을 나타냅니다. 해시 인덱스는 메모리 액세스에 최적화된 테이블에서만 지원됩니다.

주의

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이어야 합니다.

메모리 액세스에 최적화된 테이블 형식

SQL Server 2014부터 테이블 형식의 데이터 처리는 디스크가 아닌 기본 메모리에서 수행될 수 있습니다. 자세한 내용은 메모리 내 OLTP(메모리 내 최적화)을 참조하십시오. 메모리 액세스에 최적화된 테이블 형식을 만드는 방법을 보여 주는 코드 샘플은 메모리 액세스에 최적화된 테이블 및 고유하게 컴파일된 저장 프로시저 만들기를 참조하십시오. 메모리 액세스에 최적화된 테이블 형식에 대한 자세한 내용은 메모리 액세스에 최적화된 테이블 변수를 참조하십시오.

사용 권한

현재 데이터베이스에 대한 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 어셈블리를 등록합니다.

적용 대상: SQL Server 2008 - SQL Server 2014.

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

참고 항목

참조

CREATE ASSEMBLY(Transact-SQL)

DROP TYPE(Transact-SQL)

EVENTDATA(Transact-SQL)