CREATE TYPE(Transact-SQL)CREATE TYPE (Transact-SQL)

이 항목은 다음에 적용됩니다.예SQL Server(2008부터)예Azure SQL Database아니요Azure SQL Data Warehouse 아니요병렬 데이터 웨어하우스 THIS TOPIC APPLIES TO:yesSQL Server (starting with 2008)yesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

SQL ServerSQL Server 또는 Azure SQL 데이터베이스Azure SQL Database에서 현재 데이터베이스에 별칭 데이터 형식 또는 사용자 정의 형식을 만듭니다.Creates an alias data type or a user-defined type in the current database in SQL ServerSQL Server or Azure SQL 데이터베이스Azure SQL Database. 별칭 데이터 형식의 구현은 SQL ServerSQL Server 네이티브 시스템 형식을 기반으로 합니다.The implementation of an alias data type is based on a SQL ServerSQL Server native system type. 사용자 정의 형식에 있는 어셈블리의 클래스를 통해 구현 되는 MicrosoftMicrosoft .NET Framework.NET Framework 공용 언어 런타임 (CLR).A user-defined type is implemented through a class of an assembly in the MicrosoftMicrosoft .NET Framework.NET Framework common language runtime (CLR). 사용자 정의 형식을 구현 바인딩할 형식의 구현을 포함 하는 CLR 어셈블리를 등록 해야에 SQL ServerSQL Server 를 사용 하 여 CREATE ASSEMBLY합니다.To bind a user-defined type to its implementation, the CLR assembly that contains the implementation of the type must first be registered in SQL ServerSQL Server by using CREATE ASSEMBLY.

SQL ServerSQL Server에서는 CLR 코드 실행 기능이 기본적으로 해제되어 있습니다.The ability to run CLR code is off by default in SQL ServerSQL Server. 이러한 참조가 실행 되지 것입니다 수를 만들고 수정, 관리 코드 모듈을 참조 하는 데이터베이스 개체를 삭제 하지만 SQL ServerSQL Server 경우가 아니면는 clr enabled 옵션 사용 하 여 sp_configure.You can create, modify and drop database objects that reference managed code modules, but these references will not execute in SQL ServerSQL Server unless the clr enabled Option is enabled by using sp_configure.

참고

SQL Server의 통합의.NET Framework CLR은이 항목에서 설명 합니다.The integration of .NET Framework CLR into SQL Server is discussed in this topic. CLR 통합 Azure에 적용 되지 않습니다 SQL 데이터베이스SQL Database합니다.CLR integration does not apply to Azure SQL 데이터베이스SQL Database.

항목 링크 아이콘 Transact-SQL 구문 규칙Topic link icon Transact-SQL Syntax Conventions

구문Syntax

-- 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}]  
}  

인수Arguments

schema_nameschema_name
별칭 데이터 형식이나 사용자 정의 형식이 속한 스키마의 이름입니다.Is the name of the schema to which the alias data type or user-defined type belongs.

type_nametype_name
별칭 데이터 형식 또는 사용자 정의 형식의 이름입니다.Is the name of the alias data type or user-defined type. 형식 이름에 대 한 규칙을 준수 해야 식별자합니다.Type names must comply with the rules for identifiers.

base_typebase_type
SQL ServerSQL Server 별칭 데이터 형식의 기반이 되는 데이터 형식을 제공 합니다.Is the SQL ServerSQL Server supplied data type on which the alias data type is based. base_typesysname, 수 및 기본값은 없고 다음 값 중 하나일:base_type is sysname, with no default, and can be one of the following values:

bigintbigint 이진 ( n )binary( n ) bitbit char ( n )char( n )
datedate datetimedatetime datetime2datetime2 datetimeoffsetdatetimeoffset
decimaldecimal floatfloat imageimage intint
moneymoney nchar ( n )nchar( n ) ntextntext numericnumeric
nvarchar ( n | 최대)nvarchar( n | max) realreal smalldatetimesmalldatetime smallintsmallint
smallmoneysmallmoney sql_variantsql_variant texttext timetime
tinyinttinyint uniqueidentifieruniqueidentifier varbinary ( n | 최대)varbinary( n | max) varchar ( n | 최대)varchar( n | max)

base_type 이러한 시스템 데이터 형식 중 하나에 매핑되는 데이터 형식 동의어도 될 수 있습니다.base_type can also be any data type synonym that maps to one of these system data types.

전체 자릿수precision
에 대 한 10 진수 또는 숫자, 왼쪽 및 소수점의 오른쪽에 저장할 수 있는 십진수의 최대 총 수를 나타내는 음수가 아닌 정수입니다.For decimal or numeric, is a non-negative integer that indicates the maximum total number of decimal digits that can be stored, both to the left and to the right of the decimal point. 자세한 내용은 참조 decimal 및 numeric( Transact SQL ) .For more information, see decimal and numeric (Transact-SQL).

소수 자릿수scale
에 대 한 10 진수 또는 숫자소수점의 오른쪽에 저장할 수 있는 십진수의 최대 수를 나타내는 음수가 아닌 정수 이며 전체 자릿수 보다 작거나 같은 이어야 합니다 .For decimal or numeric, is a non-negative integer that indicates the maximum number of decimal digits that can be stored to the right of the decimal point, and it must be less than or equal to the precision. 자세한 내용은 참조 decimal 및 numeric( Transact SQL ) .For more information, see decimal and numeric (Transact-SQL).

NULL | NOT NULLNULL | NOT NULL
해당 형식이 Null 값을 보관할 수 있는지 여부를 지정합니다.Specifies whether the type can hold a null value. 이를 지정하지 않으면 기본값은 NULL입니다.If not specified, NULL is the default.

assembly_nameassembly_name
적용 대상: SQL Server 2008SQL Server 2008 부터 SQL Server 2017SQL Server 2017까지Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

지정 된 SQL ServerSQL Server 공용 언어 런타임에서 사용자 정의 형식의 구현을 참조 하는 어셈블리입니다.Specifies the SQL ServerSQL Server assembly that references the implementation of the user-defined type in the common language runtime. assembly_name 에 있는 기존 어셈블리와 일치 해야 SQL ServerSQL Server 현재 데이터베이스에 있습니다.assembly_name should match an existing assembly in SQL ServerSQL Server in the current database.

참고

포함된 데이터베이스에서는 EXTERNAL_NAME을 사용할 수 없습니다.EXTERNAL_NAME is not available in a contained database.

[.[. class_name] class_name ]
적용 대상: SQL Server 2008SQL Server 2008 부터 SQL Server 2017SQL Server 2017까지Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

사용자 정의 형식을 구현하는 어셈블리 내 클래스를 지정합니다.Specifies the class within the assembly that implements the user-defined type. class_name 유효한 식별자 여야 하며 어셈블리 표시 유형이 있는 어셈블리에 클래스로 존재 해야 합니다.class_name must be a valid identifier and must exist as a class in the assembly with assembly visibility. class_name 데이터베이스 데이터 정렬에 관계 없이 대/소문자 이며 해당 어셈블리의 클래스 이름과 정확히 일치 해야 합니다.class_name is case-sensitive, regardless of the database collation, and must exactly match the class name in the corresponding assembly. 클래스 이름을 대괄호로 묶인 네임 스페이스로 한정 이름일 수 있습니다 (*)는 클래스를 작성 하는 데 사용 되는 프로그래밍 언어는 C#과 같은 네임 스페이스의 개념을 사용 하는 경우.The class name can be a namespace-qualified name enclosed in square brackets (*[ ]) if the programming language that is used to write the class uses the concept of namespaces, such as C#. 경우 class_name 를 지정 하지 않으면 SQL ServerSQL Server 같은 것으로 간주 type_name합니다.If class_name is not specified, SQL ServerSQL Server assumes it is the same as type_name.

<column_definition ><column_definition>
사용자 정의 테이블 형식의 열을 정의합니다.Defines the columns for a user-defined table type.

<데이터 형식 ><data type>
사용자 정의 테이블 형식에 대한 열의 데이터 형식을 정의합니다.Defines the data type in a column for a user-defined table type. 데이터 형식에 대 한 자세한 내용은 참조 데이터 형식 ( Transact SQL ) .For more information about data types, see Data Types (Transact-SQL). 테이블에 대 한 자세한 내용은 참조 CREATE table( Transact SQL ) .For more information about tables, see CREATE TABLE (Transact-SQL).

<column_constraint ><column_constraint>
사용자 정의 테이블 형식에 대한 열 제약 조건을 정의합니다.Defines the column constraints for a user-defined table type. 지원되는 제약 조건은 PRIMARY KEY, UNIQUE 및 CHECK입니다.Supported constraints include PRIMARY KEY, UNIQUE, and CHECK. 테이블에 대 한 자세한 내용은 참조 CREATE table( Transact SQL ) .For more information about tables, see CREATE TABLE (Transact-SQL).

<computed_column_definition ><computed_column_definition>
계산 열 식을 사용자 정의 테이블 형식의 열로 정의합니다.Defines a computed column expression as a column in a user-defined table type. 테이블에 대 한 자세한 내용은 참조 CREATE table( Transact SQL ) .For more information about tables, see CREATE TABLE (Transact-SQL).

<table_constraint ><table_constraint>
사용자 정의 테이블 형식의 테이블 제약 조건을 정의합니다.Defines a table constraint on a user-defined table type. 지원되는 제약 조건은 PRIMARY KEY, UNIQUE 및 CHECK입니다.Supported constraints include PRIMARY KEY, UNIQUE, and CHECK.

<index_option ><index_option>
고유 클러스터형 또는 고유 비클러스터형 인덱스에 여러 행을 삽입하는 작업에서 중복된 키 값이 있는 경우에 대한 오류 응답을 지정합니다.Specifies the error response to duplicate key values in a multiple-row insert operation on a unique clustered or unique nonclustered index. 인덱스 옵션에 대 한 자세한 내용은 참조 CREATE index( Transact SQL ) .For more information about index options, see CREATE INDEX (Transact-SQL).

INDEXINDEX
CREATE TABLE 문의 일부로 열 및 테이블 인덱스를 지정해야 합니다.You must specify column and table indexes as part of the CREATE TABLE statement. CREATE INDEX 및 DROP INDEX는 메모리 액세스에 최적화된 테이블에서 지원되지 않습니다.CREATE INDEX and DROP INDEX are not supported for memory-optimized tables.

MEMORY_OPTIMIZEDMEMORY_OPTIMIZED
적용 대상: SQL Server 2014SQL Server 2014 통해 SQL Server 2017SQL Server 2017Azure SQL 데이터베이스Azure SQL Database합니다.Applies to: SQL Server 2014SQL Server 2014 through SQL Server 2017SQL Server 2017 and Azure SQL 데이터베이스Azure SQL Database.

테이블 형식이 메모리 액세스에 최적화된 형식인지 여부를 나타냅니다.Indicates whether the table type is memory optimized. 이 옵션은 기본적으로 해제됩니다. 테이블(형식)은 메모리 액세스에 최적화된 테이블(형식)이 아닙니다.This option is off by default; the table (type) is not a memory optimized table (type). 메모리 액세스에 최적화된 테이블 형식은 메모리 액세스에 최적화된 사용자 테이블입니다. 디스크에 저장된 스키마는 다른 사용자 테이블과 비슷합니다.Memory optimized table types are memory-optimized user tables, the schema of which is persisted on disk similar to other user tables.

BUCKET_COUNTBUCKET_COUNT
적용 대상: SQL Server 2014SQL Server 2014 통해 SQL Server 2017SQL Server 2017Azure SQL 데이터베이스Azure SQL Database합니다.Applies to: SQL Server 2014SQL Server 2014 through SQL Server 2017SQL Server 2017 and Azure SQL 데이터베이스Azure SQL Database.

해시 인덱스에서 만들어야 하는 버킷 수를 나타냅니다.Indicates the number of buckets that should be created in the hash index. 해시 인덱스에서 BUCKET_COUNT의 최대값은 1,073,741,824입니다.The maximum value for BUCKET_COUNT in hash indexes is 1,073,741,824. 버킷 수에 대 한 자세한 내용은 참조 메모리 최적화 된 테이블에 대 한 인덱스합니다.For more information about bucket counts, see Indexes for Memory-Optimized Tables. bucket_count 필수 인수입니다.bucket_count is a required argument.

HASHHASH
적용 대상: SQL Server 2014SQL Server 2014 통해 SQL Server 2017SQL Server 2017Azure SQL 데이터베이스Azure SQL Database합니다.Applies to: SQL Server 2014SQL Server 2014 through SQL Server 2017SQL Server 2017 and Azure SQL 데이터베이스Azure SQL Database.

HASH 인덱스가 만들어졌음을 나타냅니다.Indicates that a HASH index is created. 해시 인덱스는 메모리 액세스에 최적화된 테이블에서만 지원됩니다.Hash indexes are supported only on memory optimized tables.

주의Remarks

참조 되는 어셈블리의 클래스 assembly_name, 해당 메서드를 함께 사용자 정의 형식을 구현 하기 위한 모든 요구 사항을 만족 해야 SQL ServerSQL Server합니다.The class of the assembly that is referenced in assembly_name, together with its methods, should satisfy all the requirements for implementing a user-defined type in SQL ServerSQL Server. 이러한 요구 사항에 대 한 자세한 내용은 참조 clr 사용자 정의 형식합니다.For more information about these requirements, see CLR User-Defined Types.

추가적인 고려 사항은 다음과 같습니다.Additional considerations include the following:

  • 클래스는 오버로드된 메서드를 가질 수 있지만 Transact-SQLTransact-SQL이 아닌 관리 코드 내부에서만 이런 메서드를 호출할 수 있습니다.The class can have overloaded methods, but these methods can be called only from within managed code, not from Transact-SQLTransact-SQL.

  • 으로 모든 정적 멤버를 선언 해야 const 또는 readonly 경우 assembly_name 이 SAFE 또는 EXTERNAL_ACCESS 합니다.Any static members must be declared as const or readonly if assembly_name is SAFE or EXTERNAL_ACCESS.

    데이터베이스 내의 CLR에서 SQL ServerSQL Server에 업로드하는 각 형식에 대한 사용자 정의 형식은 오직 하나만 등록할 수 있습니다.Within a database, there can be only one user-defined type registered against any specified type that has been uploaded in SQL ServerSQL Server from the CLR. 데이터베이스에 사용자 정의 형식이 존재하는 CLR 형식에 대해 다시 사용자 정의 형식을 만드는 경우 CREATE TYPE에 오류가 발생하면서 실패합니다.If a user-defined type is created on a CLR type for which a user-defined type already exists in the database, CREATE TYPE fails with an error. 이런 제한은 CLR 형식을 둘 이상의 사용자 정의 형식에 매핑할 수 있는 경우 SQL 형식 확인 과정의 모호성을 피하기 위해 필요합니다.This restriction is required to avoid ambiguity during SQL Type resolution if a CLR type can be mapped to more than one user-defined type.

    형식에 모든 변경자 (mutator) 메서드가 반환 하지 않는 경우 void, CREATE TYPE 문이 실행 되지 않습니다.If any mutator method in the type does not return void, the CREATE TYPE statement does not execute.

    사용자 정의 형식을 수정하려면 DROP TYPE 문을 사용하여 해당 형식을 삭제한 다음 다시 만들어야 합니다.To modify a user-defined type, you must drop the type by using a DROP TYPE statement and then re-create it.

    사용 하 여 만들어진 사용자 정의 형식과 달리 sp_addtype, 공용 데이터베이스 역할에 CREATE TYPE을 사용 하 여 만든 형식에 대 한 REFERENCES 권한이 자동으로 부여 됩니다.Unlike user-defined types that are created by using sp_addtype, the public database role is not automatically granted REFERENCES permission on types that are created by using CREATE TYPE. 이 권한은 별도로 허가해야 합니다.This permission must be granted separately.

    구조적 사용자 정의 형식에 사용 되는 사용자 정의 테이블 형식에서 column_name <데이터 형식 >는 테이블 형식이 정의 된 데이터베이스 스키마 범위의 일부입니다.In user-defined table types, structured user-defined types that are used in column_name <data type> are part of the database schema scope in which the table type is defined. 데이터베이스 내의 다른 범위에 있는 구조적 사용자 정의 형식에 액세스하려면 두 부분으로 된 이름을 사용하세요.To access structured user-defined types in a different scope within the database, use two-part names.

    사용자 정의 테이블 형식에서 계산 열에 대한 기본 키는 PERSISTED 및 NOT NULL이어야 합니다.In user-defined table types, the primary key on computed columns must be PERSISTED and NOT NULL.

메모리 액세스에 최적화된 테이블 형식Memory-Optimized Table Types

SQL Server 2014SQL Server 2014부터 테이블 형식의 데이터 처리는 디스크가 아닌 기본 메모리에서 수행될 수 있습니다.Beginning in SQL Server 2014SQL Server 2014, processing data in a table type can be done in primary memory, and not on disk. 자세한 내용은 메모리 내 OLTP(메모리 내 최적화)를 참조하세요.For more information, see In-Memory OLTP (In-Memory Optimization). 메모리 액세스에 최적화 된 테이블 형식을 만드는 방법을 보여 주는 코드 샘플 최적화 된 테이블 및 고유 하 게 컴파일된 저장 프로시저 만들기합니다.For code samples showing how to create memory-optimized table types, see Creating a Memory-Optimized Table and a Natively Compiled Stored Procedure.

PermissionsPermissions

현재 데이터베이스에 대한 CREATE TYPE 권한 및 schema_name에 대한 ALTER 권한이 필요합니다.Requires CREATE TYPE permission in the current database and ALTER permission on schema_name. schema_name 을 지정하지 않으면 현재 사용자에 대한 스키마를 결정하는 기본 이름 확인 규칙이 적용됩니다.If schema_name is not specified, the default name resolution rules for determining the schema for the current user apply. 경우 assembly_name 지정은 사용자 어셈블리를 소유 하거나에 REFERENCES 권한이 있어야 합니다.If assembly_name is specified, a user must either own the assembly or have REFERENCES permission on it.

Examples

1.A. varchar 데이터 형식을 기반으로 별칭 유형 만들기Creating an alias type based on the varchar data type

다음 예에서는 시스템이 제공하는 varchar 데이터 형식을 기반으로 별칭 유형을 만드는 방법을 보여 줍니다.The following example creates an alias type based on the system-supplied varchar data type.

CREATE TYPE SSN  
FROM varchar(11) NOT NULL ;  

2.B. 사용자 정의 형식 만들기Creating a user-defined type

다음 예제에서는 형식 Utf8String 클래스를 참조 하는 utf8string 어셈블리에서 utf8string합니다.The following example creates a type Utf8String that references class utf8string in the assembly utf8string. 형식을 만들기 전에 로컬 데이터베이스에 utf8string 어셈블리를 등록합니다.Before creating the type, assembly utf8string is registered in the local database. CREATE ASSEMBLY의 이진 부분을 올바른 유효한 설명으로 대체합니다.Replace the binary portion of the CREATE ASSEMBLY statement with a valid description.

적용 대상: SQL Server 2008SQL Server 2008 부터 SQL Server 2017SQL Server 2017까지Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

CREATE ASSEMBLY utf8string  
AUTHORIZATION [dbi]   
FROM 0x4D... ;  
GO  
CREATE TYPE Utf8String   
EXTERNAL NAME utf8string.[Microsoft.Samples.SqlServer.utf8string] ;  
GO  

3.C. 사용자 정의 테이블 형식 만들기Creating a user-defined table type

다음 예에서는 두 개의 열이 있는 사용자 정의 테이블 형식을 만듭니다.The following example creates a user-defined table type that has two columns. 만들고 테이블 반환 매개 변수를 사용 하는 방법에 대 한 자세한 내용은 참조 테이블 반환 매개 변수 ( 데이터베이스 엔진 )합니다.For more information about how to create and use table-valued parameters, see Use Table-Valued Parameters (Database Engine).

CREATE TYPE LocationTableType AS TABLE   
    ( LocationName VARCHAR(50)  
    , CostRate INT );  
GO  

관련 항목:See Also

어셈블리 ( 만들기 Transact SQL ) CREATE ASSEMBLY (Transact-SQL)
삭제 유형을 ( Transact SQL ) DROP TYPE (Transact-SQL)
EVENTDATA(Transact-SQL)EVENTDATA (Transact-SQL)