ユーザー定義型のインスタンスの使用と変更

ユーザー定義型の用途は次のとおりです。

  • ユーザー定義型列を含んだテーブルを作成する

  • ユーザー定義型列の値を挿入および変更する

  • ユーザー定義型を変数またはパラメータとして使用する

ユーザー定義型列を含むテーブルの作成

ユーザー定義型列を含むテーブルを作成するには、列名を指定し型名を参照します。これは、システムベースのデータ型または別名型の列を作成するときの手順と同様です。共通言語ランタイム (CLR) ユーザー定義型の列を作成するには、その型に対する REFERENCES 権限が必要です。

ユーザー定義型列を含んだテーブルを作成するには

ユーザー定義型列の値の挿入と変更

列の値を挿入および変更したり、ユーザー定義型の変数やパラメータの値を変更したりすることができます。

注意

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

ユーザー定義型列の値を挿入または変更するには、次の手順を実行します。

  • ユーザー定義型で SQL Server システム データ型からの暗黙的または明示的な変換がサポートされている場合は、そのシステム データ型の値を指定します。次の例は、文字列からの明示的な変換によって、ユーザー定義型 Point の列の値を更新する方法を示します。

    UPDATE Cities
    SET Location = CONVERT(Point, '12.3:46.2')
    WHERE Name = 'Anchorage'
    
  • mutator のマークが付いている、ユーザー定義型のメソッドを呼び出し、更新を実行します。次に、point 型のインスタンスの状態を更新する、SetXY というこの型のミューテータ メソッドを呼び出す例を示します。

    UPDATE Cities
    SET Location.SetXY(23.5, 23.5)
    WHERE Name = 'Anchorage'
    
    注意

    ミューテータ メソッドを Transact-SQL の NULL 値で呼び出した場合や、ミューテータ メソッドにより生成された新しい値が NULL である場合、エラーが返されます。

  • ユーザー定義型のプロパティまたはパブリック フィールドの値を変更します。値を指定する式では、プロパティの型を暗黙の型変換できる必要があります。次の例では、ユーザー定義型 point のプロパティ X の値を変更します。

    UPDATE Cities
    SET Location.X = 23.5
    WHERE Name = 'Anchorage'
    

    同一のユーザー定義型の列のプロパティを複数変更するには、複数の UPDATE ステートメントを実行するか、その型のミューテータ メソッドを呼び出します。

次に、Point 型の値をテーブルに挿入する例を示します。

INSERT INTO Cities (Name, Location)
VALUES ('Anchorage', CONVERT(Point, '23.5, 23.5'))

テーブルまたはビューにユーザー定義型の値を挿入するには

  • INSERT (Transact-SQL)

  • テーブルまたはビューのユーザー定義型の値を更新するには

UPDATE (Transact-SQL)

変数またはパラメータとしてのユーザー定義型の使用

Transact-SQL 変数、Transact-SQL または Microsoft .NET Framework の関数やプロシージャのパラメータをユーザー定義型として宣言できます。次の規則が適用されます。

  • その型の EXECUTE 権限が必要です。

  • スキーマ バインドを行ってユーザー定義型を宣言している関数、ストアド プロシージャ、またはトリガを作成する場合、その型の REFERENCES 権限が必要です。

1 つの要素で構成される名前を使用する場合、型参照は次の順序で検索されます。

  1. 現在のデータベースの現在のユーザーのスキーマ。

  2. 現在のデータベースの dbo のスキーマ。

  3. システムのネイティブ型空間。

関数またはプロシージャの Transact-SQL 変数やパラメータとしてユーザー定義型を宣言するには

ユーザー定義型の使用に関する制限

ユーザー定義型を作成および使用するときは、次のことを考慮してください。

  • SQL Server でユーザー定義型を作成するときは、長さ、小数点以下桁数、有効桁数、およびその他のメタデータを定義できません。

  • 別のデータベースで定義したユーザー定義型として列、変数、およびパラメータを宣言することはできません。詳細については、「複数のデータベース間でのユーザー定義型の使用」を参照してください。

  • 型 ID はユーザー定義型が存続している間のみ有効で、再利用される場合もあるので、ユーザー定義型が以前に定義したものと同一かどうかを確認するために型 ID を比較しないでください。この確認を行うには、CLR 型名、4 部構成のアセンブリ名、およびアセンブリのバイト数を比較してください。

  • sql_variant 列にユーザー定義型のインスタンスを含めることはできません。

  • ユーザー定義型は、CLR のプロシージャ、関数、またはトリガの既定値として、あるいはパーティション関数で使用することはできません。

  • ユーザー定義型は、table 変数の計算列では参照できません。