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

適用対象: ○SQL Server (2008 以降) ○Azure SQL Database XAzure SQL Data Warehouse XParallel Data Warehouse APPLIES TO: yesSQL Server (starting with 2008) yesAzure SQL Database noAzure 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). ユーザー定義型を実装にバインドするには、先に CREATE ASSEMBLY を使用して、その実装を含む CLR アセンブリを SQL ServerSQL Server で登録しておく必要があります。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 で実行するには、sp_configure を使用して clr enabled オプションを有効にする必要があります。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

-- User-defined Data 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> [ ,... n ] }
    | [ <table_constraint> ] [ ,... n ]    
    | [ <table_index> ] [ ,... 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 }  
}  

< table_index > ::=  
  INDEX constraint_name  
     [ CLUSTERED | NONCLUSTERED ]   (column [ ASC | DESC ] [ ,... n ] )} }  
-- User-defined Memory Optimized Table Types Syntax  
CREATE TYPE [schema_name. ] type_name  
AS TABLE ( { <column_definition> [ ,... n ] }  
    | [ <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_type のデータ型は sysname で、既定値はありません。有効値は次のとおりです。base_type is sysname, with no default, and can be one of the following values:

bigintbigint binary( 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 | max)nvarchar( n | max) realreal smalldatetimesmalldatetime smallintsmallint
smallmoneysmallmoney sql_variantsql_variant texttext timetime
tinyinttinyint uniqueidentifieruniqueidentifier varbinary( n | max)varbinary( n | max) varchar( n | max)varchar( n | max)

また base_type は、これらのシステム データ型のいずれかにマップする任意のデータ型のシノニムにすることもできます。base_type can also be any data type synonym that maps to one of these system data types.

有効桁数 (precision)precision
decimal 型または numeric 型の場合は、格納可能な 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).

scalescale
decimal 型または numeric 型の場合は、小数点の右側にとることができる 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 2008:SQL Server 2008 から SQL Server 2017SQL Server 2017Applies to: SQL Server 2008:SQL 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 2008:SQL Server 2008 から SQL Server 2017SQL Server 2017Applies to: SQL Server 2008:SQL 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><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).

INDEX *index_name* [ CLUSTERED | NONCLUSTERED ] (*column_name* [ ASC | DESC ] [ ,... *n* ] )

適用対象: SQL Server 2014 (12.x)SQL Server 2014 (12.x) から SQL Server 2017SQL Server 2017 および Azure SQL データベースAzure SQL DatabaseApplies to: SQL Server 2014 (12.x)SQL Server 2014 (12.x) through SQL Server 2017SQL Server 2017 and Azure SQL データベースAzure SQL Database.

これを指定すると、テーブルにインデックスを作成します。Specifies to create an index on the table. これには、クラスター化インデックスまたは非クラスター化インデックスを指定できます。This can be a clustered index, or a nonclustered index. インデックスでは、この一覧を表示すると、列が含まれてし、昇順または降順で並べ替えます。The index will contain the columns listed, and will sort the data in either ascending or descending order.

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 2014 (12.x)SQL Server 2014 (12.x) から SQL Server 2017SQL Server 2017 および Azure SQL データベースAzure SQL DatabaseApplies to: SQL Server 2014 (12.x)SQL Server 2014 (12.x) 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 2014 (12.x)SQL Server 2014 (12.x) から SQL Server 2017SQL Server 2017 および Azure SQL データベースAzure SQL DatabaseApplies to: SQL Server 2014 (12.x)SQL Server 2014 (12.x) 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 2014 (12.x)SQL Server 2014 (12.x) から SQL Server 2017SQL Server 2017 および Azure SQL データベースAzure SQL DatabaseApplies to: SQL Server 2014 (12.x)SQL Server 2014 (12.x) through SQL Server 2017SQL Server 2017 and Azure SQL データベースAzure SQL Database.

ハッシュ インデックスを作成することを示します。Indicates that a HASH index is created. ハッシュ インデックスは、メモリ最適化テーブルでのみサポートされます。Hash indexes are supported only on memory optimized tables.

RemarksRemarks

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.

  • assembly_name が SAFE または EXTERNAL_ACCESS の場合、すべての静的メンバーは const または readonly として宣言する必要があります。Any static members must be declared as const or readonly if assembly_name is SAFE or EXTERNAL_ACCESS.

    データベース内では、 SQL ServerSQL Server で CLR からアップロードされた任意の指定された型に対して、1 つのユーザー定義型のみを登録できます。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.

    型のミューテーター メソッドが 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 を使用して作成した型に対しては、データベース ロール public に 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 <data type> で使用される構造化ユーザー定義型は、テーブル型が定義されているデータベース スキーマ スコープの一部になります。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. データベース内の別のスコープに含まれている構造化ユーザー定義型にアクセスするには、2 つの部分から構成される名前を使用します。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 2014 (12.x)SQL Server 2014 (12.x) 以降では、ディスク上ではなく、プライマリ メモリ内でテーブル型のデータを処理できます。Beginning in SQL Server 2014 (12.x)SQL Server 2014 (12.x), 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.

アクセス許可Permissions

現在のデータベース内の 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.

CREATE TABLE ステートメント内の列をユーザー定義型として定義する場合は、そのユーザー定義型に対する REFERENCES 権限が必要です。If any columns in the CREATE TABLE statement are defined to be of a user-defined type, REFERENCES permission on the user-defined type is required.

注意

ユーザー定義型を使用する列があるテーブルを作成するユーザーは、そのユーザー定義型に対して REFERENCES アクセス許可を持っている必要があります。A user creating a table with a column that uses a user-defined type needs the REFERENCES permission on the user-defined type. このテーブルを TempDB 内に作成する必要がある場合、テーブルを作成するに毎回 REFERENCES アクセス許可を明示的に付与する必要があります。または、このデータ型と REFERENCES アクセス許可を model データベースに追加する必要があります。If this table must be created in TempDB, then either the REFERENCES permission needs to be granted explicitly each time before the table is created, or this data type and REFERENCES permissions need to be added to the Model database. この処理が完了すると、このデータ型とアクセス許可は TempDB で永続的に利用できるようになります。If this is done, then this data type and permissions will be available in TempDB permanently. この処理が完了していない場合、SQL Server の再起動時にユーザー定義のデータ型とアクセス許可は消去されます。Otherwise, the user-defined data type and permissions will disappear when SQL Server is restarted. 詳細については、「CREATE TABLE」を参照してください。For more information, see CREATE TABLE

使用例Examples

A.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 ;  

B.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 2008:SQL Server 2008 から SQL Server 2017SQL Server 2017Applies to: SQL Server 2008:SQL 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  

C.C. ユーザー定義テーブル型を作成するCreating a user-defined table type

次の例では、2 つの列を持つユーザー定義テーブル型が作成されます。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

CREATE ASSEMBLY (Transact-SQL) CREATE ASSEMBLY (Transact-SQL)
DROP TYPE (Transact-SQL) DROP TYPE (Transact-SQL)
EVENTDATA (Transact-SQL)EVENTDATA (Transact-SQL)