CREATE TYPE (Transact-SQL)

SQL Server または Azure AQL データベース で別名データ型またはユーザー定義型を現在のデータベースで作成します。 別名データ型の実装は、SQL Server のネイティブ システム型に基づきます。 ユーザー定義型は、Microsoft .NET Framework 共通言語ランタイム (CLR) のアセンブリのクラスを使用して実装します。 ユーザー定義型を実装にバインドするには、先に CREATE ASSEMBLY を使用して、その実装を含む CLR アセンブリを SQL Server で登録しておく必要があります。

既定では、SQL Server の CLR コード実行機能は無効になっています。 マネージ コード モジュールを参照するデータベース オブジェクトを作成、変更、および削除できますが、それらの参照を SQL Server で実行するには、sp_configure を使用して clr enabled オプションを有効にする必要があります。

適用対象: SQL Server (SQL Server 2008 から現在のバージョンまで)、Azure AQL データベース (初回のリリースから現在のバージョンまで)

トピック リンク アイコン 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 型の場合は、格納可能な 10 進数の最大桁数を示す、負ではない整数です。これは、小数点の左側と右側の桁数の合計です。 詳細については、「decimal 型と numeric 型 (Transact-SQL)」を参照してください。

  • scale
    decimal 型または numeric 型の場合は、小数点の右側にとることができる 10 進数の最大桁数を示す、負ではない整数です。有効桁数以下の数値である必要があります。 詳細については、「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>
    ユーザー定義テーブル型の列を定義します。

  • <data type>
    ユーザー定義テーブル型の列でデータ型を定義します。 データ型の詳細については、「データ型 (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

    ハッシュ インデックスを作成することを示します。 ハッシュ インデックスは、メモリ最適化テーブルでのみサポートされます。

説明

assembly_name とそのメソッドで参照されているアセンブリのクラスは、SQL Server でユーザー定義型を実装するためのすべての要件を満たしている必要があります。 これらの要件の詳細については、「CLR ユーザー定義型」を参照してください。

その他、次のような注意事項があります。

  • クラスにはオーバーロードされたメソッドが存在する可能性があります。ただし、これらのメソッドはマネージ コード内からのみ呼び出すことができ、Transact-SQL から呼び出すことはできません。

  • assembly_name が SAFE または EXTERNAL_ACCESS の場合、すべての静的メンバーは const または readonly として宣言する必要があります。

データベース内では、SQL Server で CLR からアップロードされた任意の指定された型に対して、1 つのユーザー定義型のみを登録できます。 データベース内にユーザー定義型が既に存在する CLR 型に対してユーザー定義型を作成した場合、CREATE TYPE は失敗し、エラーが発生します。 この制約が必要なのは、CLR 型を複数のユーザー定義型にマップすることが可能な場合の、SQL 型の解決時のあいまいな状態を避けるためです。

型のミューテーター メソッドが void を返さない場合、CREATE TYPE ステートメントは実行されません。

ユーザー定義型を変更するには、DROP TYPE ステートメントを使用して型を削除してから、再作成する必要があります。

sp_addtype を使用して作成したユーザー定義型と異なり、CREATE TYPE を使用して作成した型に対しては、データベース ロール public に REFERENCES 権限が自動的に付与されるわけではありません。 この権限は個別に付与する必要があります。

ユーザー定義テーブル型の場合、column_name <data type> で使用される構造化ユーザー定義型は、テーブル型が定義されているデータベース スキーマ スコープの一部になります。 データベース内の別のスコープに含まれている構造化ユーザー定義型にアクセスするには、2 つの部分から構成される名前を使用します。

ユーザー定義テーブル型では、計算列の主キーを PERSISTED および NOT NULL にする必要があります。

メモリ最適化テーブル型

SQL Server 2014 以降では、ディスク上ではなく、プライマリ メモリ内でテーブル型のデータを処理できます。 詳細については、「インメモリ OLTP (インメモリ最適化)」を参照してください。 メモリ最適化テーブル型を作成する方法を示すコード サンプルについては、「メモリ最適化テーブルおよびネイティブ コンパイル ストアド プロシージャの作成」を参照してください。 メモリ最適化テーブル型の詳細については、「メモリ最適化テーブル変数」を参照してください。

権限

現在のデータベース内の CREATE TYPE 権限、および schema_name に対する ALTER 権限が必要です。 schema_name を指定しなかった場合は、現在のユーザーのスキーマを判断するための既定の名前解決ルールが適用されます。 assembly_name を指定した場合は、ユーザーがそのアセンブリの所有者であるか、そのアセンブリに対する REFERENCES 権限を持っている必要があります。

使用例

A. varchar データ型に基づいた別名型を作成する

次の例では、システムから提供されている varchar データ型に基づいて、別名型を作成します。

CREATE TYPE SSN
FROM varchar(11) NOT NULL ;

B. ユーザー定義型を作成する

次の例では、アセンブリ 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

C. ユーザー定義テーブル型を作成する

次の例では、2 つの列を持つユーザー定義テーブル型が作成されます。 テーブル値パラメーターの作成方法および使用方法の詳細については、「テーブル値パラメーターの使用 (データベース エンジン)」を参照してください。

/* 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)