次の方法で共有


CREATE TYPE (Transact-SQL)

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

注意

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

トピック リンク アイコンTransact-SQL 構文表記規則

構文

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

  • scale
    decimal 型または numeric 型の場合は、小数点の右側にとることができる 10 進数の最大桁数を示す、負ではない整数です。有効桁数以下の数値である必要があります。詳細については、「decimal 型と numeric 型 (Transact-SQL)」を参照してください。

  • NULL | NOT NULL
    型が NULL 値を保持できるかどうかを指定します。指定しない場合は、NULL が既定値です。

  • assembly_name
    共通言語ランタイム内のユーザー定義型の実装を参照する SQL Server のアセンブリを指定します。assembly_name は、SQL Server の現在のデータベース内の既存のアセンブリに一致している必要があります。

  • [.class_name ]
    ユーザー定義型を実装するアセンブリ内のクラスを指定します。class_name は有効な識別子であり、アセンブリ内にアセンブリで可視のクラスとして存在している必要があります。class_name は、対応するアセンブリ内のクラス名に正確に一致している必要があります。大文字と小文字は、データベース照合順序に関係なく区別されます。クラスの記述に使用されている C# などのプログラミング言語が、名前空間の概念を使用している場合、クラス名は、角かっこ (
    [ ]
    ) で囲まれた名前空間で修飾された名前にすることができます。class_name を指定しなかった場合、SQL Server では、type_name と同じにするものと見なされます。

  • <column_definition>
    ユーザー定義テーブル型の列を定義します。列の詳細については、「列の追加と削除」を参照してください。

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

データベース内では、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 にする必要があります。

権限

現在のデータベース内の 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 がローカル データベースに登録されます。

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