ユーザー定義型に対する操作

ユーザー定義型のインスタンスには、さまざまな操作を実行できます。実行できる操作の一部を次に示します。

  • ユーザー定義型のメソッドの呼び出しまたはユーザー定義型のプロパティの取得。

  • データ型変換の実行。

  • ユーザー定義型の値を SQL クライアントに返す操作。

  • ORDER BY 句の使用。

  • ユーザー定義型列でのインデックスの作成。

  • 計算列の作成。

ユーザー定義型のメソッドの呼び出しまたはユーザー定義型のプロパティの取得

ユーザー定義型のメソッドの呼び出しやユーザー定義型のプロパティの取得は、スカラ式を使用できる箇所であればどこでも行うことができます。その型の EXECUTE 権限が必要です。UPDATE ステートメント外でデータの状態を変更するメソッドは実行されますが、クエリでは変更可能なメソッドは使用できないので、その変更は無視されます。

ユーザー定義型のメソッドから返される文字列では、現在のデータベースに関係なく、ユーザー定義型の作成時のデータベース照合順序が想定されます。

注記注意

SELECT ステートメントで使用するメソッドやプロパティは、副作用を伴ってはいけません。SELECT ステートメントで使用するメソッドに副作用がある場合、結果は決定的ではありません。

注記注意

計算列を作成するユーザー定義型に対してメソッドまたはプロパティの呼び出しを行い、計算列での操作のコンテキストでその呼び出しを行うとき、その型の EXECUTE 権限はチェックされません。代わりに、計算列の作成時に権限がチェックされます。

ユーザー定義型のメソッドの呼び出しまたはユーザー定義型のプロパティの取得を行うには

注意

SQL Server Management Studio は、ユーザー定義型の値をバイナリ表記で返します。ユーザー定義型の値が文字列形式または XML 形式で返されるようにするには、CAST または CONVERT を使用します。

ユーザー定義型を使用したデータ型変換の実行

次の表で概要を示すように、ユーザー定義型を使用して暗黙的な変換および明示的な変換を実行できます。

 

変換後の

ユーザー定義型

バイナリ

nvarchar

xml

変換前の

ユーザー定義型

 

明示的

明示的

暗黙

バイナリ

暗黙

 

 

 

nvarchar

暗黙

 

 

 

xml

暗黙

 

 

 

次の例では、ユーザー定義型 ComplexNumber のインスタンスを xml に明示的に変換し、そのインスタンスで XQuery 式を呼び出します。

DECLARE @c ComplexNumber
SET @c = CONVERT(ComplexNumber, '(1,2i)')
SELECT CAST(@c AS xml).query('//Real/text()')

次の例では、xml データをユーザー定義型 ComplexNumber のインスタンスに暗黙的に変換します。

DECLARE @x xml, @u ComplexNumber
SET @x = '<ComplexNumber><Real>100</Real><Imaginary>4</Imaginary></ComplexNumber>'
SET @u = @x -- implicit convert
SELECT @u.ToString()

詳細については、「CAST および CONVERT (Transact-SQL)」を参照してください。

ユーザー定義型の値を SQL クライアントに返す操作

ユーザー定義型の列または式が SELECT ステートメントまたは FETCH ステートメントの結果として SQL クライアントに返される場合、クライアント API による列へのアクセス方法は、クライアント API がマネージ API (ADO.NET) であるか、またはアンマネージ API (ODBC または OLE DB) であるかどうかによって異なります。クライアントで ADO.NET を使用している場合、ユーザー定義型のインスタンスは、SqlDataReader クラスの GetValue メソッドを使用してバイナリ値として、またはオブジェクトとして取得することができます。クライアントで OLE DB を使用している場合、クライアントは、ユーザー定義型の値をバイナリ値として受け取ります。クライアントで ODBC を使用している場合、クライアントは、ユーザー定義型の値をバイナリ値としてのみ受け取ります。

ユーザー定義型での ORDER BY 句、GROUP BY 句、および PARTITION BY 句の使用

ユーザー定義型でバイナリ順がサポートされている場合は、その型を使用して ORDER BY 操作、GROUP BY 操作、および PARTITION BY 操作を実行できます。型定義の一部として指定されている SqlUserDefinedType 属性の IsByteOrdered フラグが true に設定されている場合、その型の順序付けはバイナリ順になります。このフラグは、型のバイナリ表記がその型に対して意味的に正しい順序で並べられていることを示します。

ユーザー定義型列でのインデックスの作成

ユーザー定義型でバイナリ順がサポートされている場合、その型の列でインデックスを作成できます。また、メソッドが決定的であるとマークされている限り、ユーザー定義型列のメソッド呼び出しとして定義される計算列でインデックスを作成することもできます。詳細については、「CLR ユーザー定義型」を参照してください。