ユーザー定義型のインスタンスの使用と変更
ユーザー定義型の用途は次のとおりです。
ユーザー定義型列を含んだテーブルを作成する
ユーザー定義型列の値を挿入および変更する
ユーザー定義型を変数またはパラメータとして使用する
ユーザー定義型列を含むテーブルの作成
ユーザー定義型列を含むテーブルを作成するには、列名を指定し型名を参照します。これは、システムベースのデータ型または別名型の列を作成するときの手順と同様です。共通言語ランタイム (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'))
テーブルまたはビューにユーザー定義型の値を挿入するには
テーブルまたはビューのユーザー定義型の値を更新するには
変数またはパラメータとしてのユーザー定義型の使用
Transact-SQL 変数、Transact-SQL または Microsoft.NET Framework の関数やプロシージャのパラメータをユーザー定義型として宣言できます。次の規則が適用されます。
その型の EXECUTE 権限が必要です。
スキーマ バインドを行ってユーザー定義型を宣言している関数、ストアド プロシージャ、またはトリガを作成する場合、その型の REFERENCES 権限が必要です。
1 つの要素で構成される名前を使用する場合、型参照は次の順序で検索されます。
現在のデータベースの現在のユーザーのスキーマ。
現在のデータベースの dbo のスキーマ。
システムのネイティブ型空間。
関数またはプロシージャの Transact-SQL 変数やパラメータとしてユーザー定義型を宣言するには
ユーザー定義型の使用に関する制限
ユーザー定義型を作成および使用するときは、次のことを考慮してください。
SQL Server でユーザー定義型を作成するときは、長さ、小数点以下桁数、有効桁数、およびその他のメタデータを定義できません。
別のデータベースで定義したユーザー定義型として列、変数、およびパラメータを宣言することはできません。詳細については、「複数のデータベース間でのユーザー定義型の使用」を参照してください。
型 ID はユーザー定義型が存続している間のみ有効で、再利用される場合もあるので、ユーザー定義型が以前に定義したものと同一かどうかを確認するために型 ID を比較しないでください。この確認を行うには、CLR 型名、4 部構成のアセンブリ名、およびアセンブリのバイト数を比較してください。
sql_variant 列にユーザー定義型のインスタンスを含めることはできません。
ユーザー定義型は、CLR のプロシージャ、関数、またはトリガの既定値として、あるいはパーティション関数で使用することはできません。
ユーザー定義型は、table 変数の計算列では参照できません。