CREATE TYPE (Transact-SQL)

更新 : 2006 年 4 月 14 日

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

ms175007.note(ja-jp,SQL.90).gifメモ :
既定では、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 ] 
} [ ; ]

引数

  • schema_name
    別名データ型またはユーザー定義型が所属しているスキーマの名前です。
  • type_name
    別名データ型またはユーザー定義型の名前です。型の名前は、識別子の規則に従っている必要があります。
  • base_type
    別名データ型の基になる、SQL Server 提供のデータ型です。base_typesysname であり、既定値はありません。有効値は次のとおりです。

    bigint

    binary(n)

    bit

    char(n)

    datetime

    decimal

    float

    image

    int

    money

    nchar(n)

    ntext

    numeric

    nvarchar(n | max)

    real

    smalldatetime

    smallint

    smallmoney

    sql_variant

    text

    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 と同じにするものと見なされます。

解説

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 権限が自動的に付与されるわけではありません。この権限は個別に付与する必要があります。

権限

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

参照

関連項目

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

その他の技術情報

別名データ型を使用した作業
CLR ユーザー定義型の使用

ヘルプおよび情報

SQL Server 2005 の参考資料の入手

変更履歴

リリース 履歴

2006 年 4 月 14 日

新しい内容 :
  • 「解説」に、CREATE TYPE を使用して CLR ユーザー定義型を作成する場合、データベース互換性は 90 である必要があることを示す文を追加しました。
  • [.class_name ] の「引数」に、class_name を指定しなかった場合、SQL Server により type_name と同じにすると見なされる記述を追加しました。