ユーザー定義型の実装

このトピックでは、SQL Server で共通言語ランタイム (CLR) ユーザー定義型を作成および削除する方法について説明します。

ユーザー定義型の作成

SQL Server でユーザー定義型を作成するには、次の手順を順番に実行する必要があります。

  • ユーザー定義型を Microsoft .NET Framework でサポートされる言語のクラスまたは構造として定義します。CLR での型のプログラミング方法の詳細については、「CLR プログラミング サンプル」を参照してください。 サンプルの詳細については、「SQL Server のサンプルとサンプル データベースのインストールに関する注意点」を参照してください。次に、適切な言語コンパイラを使用してクラスまたは構造をコンパイルし、.NET Framework のアセンブリをビルドします。

  • CREATE ASSEMBLY ステートメントを使用して、SQL Server にアセンブリを登録します。SQL Server のアセンブリの詳細については、「アセンブリ (データベース エンジン)」を参照してください。

  • 登録したアセンブリを参照する型を作成します。

注意

Microsoft Visual Studio で SQL Server プロジェクトを配置すると、そのプロジェクトで指定されたデータベース内のアセンブリが登録されます。また、プロジェクトを配置することで、SqlUserDefinedType 属性で注釈が付けられたすべてのクラス定義に対応する CLR ユーザー データ型がデータベースに作成されます。詳細については、「CLR データベース オブジェクトの配置」を参照してください。

注意

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

アセンブリを作成、変更、または削除するには

ユーザー定義型を作成するには

ユーザー定義型の削除

ユーザー定義型を削除するには

注意

作成したユーザー定義型を変更すると、テーブルのデータまたはインデックスが無効になる場合があるので、ユーザー定義型を作成後に変更することはできません。型を変更するには、型を削除して再作成するか、WITH UNCHECKED DATA 句を使用して ALTER ASSEMBLY ステートメントを実行する必要があります。

削除する型へのすべての参照が削除されるまでは、ユーザー定義型を削除できません。これらの参照には、次のようなものがあります。

  • 型で定義された列。

  • 型を参照する式を持つ計算列および CHECK 制約。

  • 定義内の式で型を参照するスキーマ バインド ビューおよびスキーマ バインド関数。

  • 関数とストアド プロシージャのパラメーター。

ユーザー定義型に依存する列を検索するには

次の例では、ユーザー定義型 ComplexNumber で定義された列のメタデータを取得します。

SELECT * FROM sys.columns 
WHERE user_type_id = TYPE_ID('ComplexNumber');

次の例では、ユーザー定義型 ComplexNumber で定義された列に関する、最も特権の少ないユーザー用に制限したメタデータを取得します。

SELECT * FROM sys.column_type_usages 
WHERE user_type_id = TYPE_ID('ComplexNumber');

ユーザー定義型に依存する計算列の式、CHECK 制約の式、およびモジュール式を検索するには

次の例では、ユーザー定義型 SimpleUdt に依存する計算列 (およびそのテーブル) の名前を取得します。

SELECT OBJECT_SCHEMA_NAME (referencing_id) AS referencing_schema_name,
    OBJECT_NAME(referencing_id) AS referencing_name,
    COL_NAME(referencing_id, referencing_minor_id) AS column_name,
    is_caller_dependent,
    is_ambiguous
FROM sys.sql_expression_dependencies
WHERE referenced_id = TYPE_ID('SimpleUdt')
    AND referenced_class = 6 
    AND OBJECTPROPERTY(referencing_id, 'IsTable')=1; 

次の例では、ユーザー定義型 SimpleUdt に依存する CHECK 制約 (および CHECK 制約が定義されるオブジェクト) の名前を取得します。

SELECT SCHEMA_NAME(o.schema_id) AS schema_name,
    OBJECT_NAME(o.parent_object_id) AS table_name,
    OBJECT_NAME(o.object_id) AS constraint_name
FROM sys.sql_expression_dependencies AS d
JOIN sys.objects AS o
ON o.object_id = d.referencing_id
WHERE referenced_id = TYPE_ID('SimpleUdt')
AND referenced_class = 6 
AND OBJECTPROPERTY(o.object_id, 'IsCheckCnst')=1;

次の例では、ユーザー定義型 SimpleUdt への参照を含む定義を持つ、モジュールの名前を取得します。

USE AdventureWorks2008R2;
GO
SELECT referencing_schema_name, referencing_entity_name, referencing_id, referencing_class_desc, is_caller_dependent
FROM sys.dm_sql_referencing_entities ('SimpleUdt', 'TYPE');
GO

ユーザー定義型に依存するパラメーターを検索するには

次の例では、ユーザー定義型 ComplexNumber で定義されたパラメーター (およびパラメーターが所属するオブジェクト) の名前を取得します。

SELECT OBJECT_NAME(object_id) AS object_name,
    NULL AS procedure_number,
    name AS param_name,
    parameter_id AS param_num,
    TYPE_NAME(p.user_type_id) AS type_name
FROM sys.parameters AS p
WHERE p.user_type_id = TYPE_ID('ComplexNumber')
ORDER BY object_name, procedure_number, param_num;

次の例では、ユーザー定義型 ComplexNumber で定義されたパラメーターに関する、最も特権の少ないユーザー用に制限したメタデータを取得します。

SELECT * FROM sys.parameter_type_usages 
WHERE user_type_id = TYPE_ID('ComplexNumber');