ユーザー定義型の使用 - UDT データの操作

適用対象:SQL Server

Transact-SQL では、ユーザー定義型 (UDT) 列のデータを変更するときに、INSERT、UPDATE、または DELETE ステートメントの特殊な構文は提供されません。 Transact-SQL CAST 関数または CONVERT 関数は、ネイティブ データ型を UDT 型にキャストするために使用されます。

UDT 列へのデータの挿入

次の Transact-SQL ステートメントは、3 行のサンプル データを Points テーブルに挿入します。 Point データ型は、UDT のプロパティとして公開される X と Y の整数値で構成されます。 コンマ区切りの X 値と Y 値を Point 型にキャストするには、CAST 関数または CONVERT 関数を使用する必要があります。 最初の 2 つのステートメントでは CONVERT 関数を使用して文字列値を Point 型に変換し、3 番目のステートメントでは CAST 関数を使用します。

INSERT INTO dbo.Points (PointValue) VALUES (CONVERT(Point, '3,4'));  
INSERT INTO dbo.Points (PointValue) VALUES (CONVERT(Point, '1,5'));  
INSERT INTO dbo.Points (PointValue) VALUES (CAST ('1,99' AS Point));  

データの選択

次の SELECT ステートメントでは、UDT のバイナリ値を選択します。

SELECT ID, PointValue FROM dbo.Points  

読み取り可能な形式で表示される出力を確認するには、Point UDT の ToString メソッドを呼び出して、値を文字列形式に変換します。

SELECT ID, PointValue.ToString() AS PointValue   
FROM dbo.Points;  

これにより、次の結果が生成されます。

ID PointValue  
-- ----------  
 1 3,4  
 2 1,5  
 3 1,99  

Transact-SQL CAST 関数と CONVERT 関数を使用して、同じ結果を得ることもできます。

SELECT ID, CAST(PointValue AS varchar)   
FROM dbo.Points;  
  
SELECT ID, CONVERT(varchar, PointValue)   
FROM dbo.Points;  

Point UDT では、X 座標と Y 座標がプロパティとして公開され、個別に選択できます。 次の Transact-SQL ステートメントでは、X 座標と Y 座標を個別に選択します。

SELECT ID, PointValue.X AS xVal, PointValue.Y AS yVal   
FROM dbo.Points;  

X プロパティと Y プロパティから整数値が返され、結果セットに表示されます。

ID xVal yVal  
-- ---- ----  
 1    3    4  
 2    1    5  
 3    1   99  

変数を使用した作業

変数を使用するには、DECLARE ステートメントを使用して、UDT 型にその変数を割り当てます。 次のステートメントでは、Transact-SQL SET ステートメントを使用して値を割り当て、変数に対して UDT の ToString メソッドを呼び出して結果を表示します。

DECLARE @PointValue Point;  
SET @PointValue = (SELECT PointValue FROM dbo.Points  
    WHERE ID = 2);  
SELECT @PointValue.ToString() AS PointValue;  

結果セットには、次のように変数の値が表示されます。

PointValue  
----------  
-1,5  

次の Transact-SQL ステートメントでは、変数の割り当てに SET ではなく SELECT を使用して同じ結果が得られます。

DECLARE @PointValue Point;  
SELECT @PointValue = PointValue FROM dbo.Points  
    WHERE ID = 2;  
SELECT @PointValue.ToString() AS PointValue;  

変数の代入に SELECT ステートメントを使用した場合と SET ステートメントを使用した場合には異なる点が 1 つあります。SELECT ステートメントでは 1 つのステートメントで複数の変数に代入できますが、SET 構文では、1 つ変数に代入するごとに 1 つの SET ステートメントが必要になります。

データの比較

クラスを定義するときに IsByteOrdered プロパティを true に設定している場合は、比較演算子を使用して UDT 内の値を比較できます。 詳細については、「 User-Defined型の作成」を参照してください。

SELECT ID, PointValue.ToString() AS Points   
FROM dbo.Points  
WHERE PointValue > CONVERT(Point, '2,2');  

値自体が同等の場合は、 IsByteOrdered 設定に 関係なく UDT の内部値を比較できます。 次の Transact-SQL ステートメントは、X が Y より大きい行を選択します。

SELECT ID, PointValue.ToString() AS PointValue   
FROM dbo.Points  
WHERE PointValue.X < PointValue.Y;  

また、一致する PointValue を検索する次のクエリのように、変数と比較演算子を組み合わせて使用することもできます。

DECLARE @ComparePoint Point;  
SET @ComparePoint = CONVERT(Point, '3,4');  
SELECT ID, PointValue.ToString() AS MatchingPoint   
FROM dbo.Points  
WHERE PointValue = @ComparePoint;  

UDT メソッドの呼び出し

Transact-SQL の UDT で定義されているメソッドを呼び出すこともできます。 Point クラスには、Distance、DistanceFromDistanceFromXY の 3 つのメソッドが含まれています。 これら 3 つのメソッドを定義するコード一覧については、「 User-Defined型のコーディング」を参照してください。

次の Transact-SQL ステートメントは 、PointValue.Distance メソッドを呼び出します。

SELECT ID, PointValue.X AS [Point.X],   
    PointValue.Y AS [Point.Y],  
    PointValue.Distance() AS DistanceFromZero   
FROM dbo.Points;  

結果が [ 距離 ] 列に表示されます。

ID X  Y  Distance  
-- -- -- ----------------  
 1  3  4                5  
 2  1  5 5.09901951359278  
 3  1 99 99.0050503762308  

DistanceFrom メソッドは Point データ型の引数を受け取り、指定したポイントから PointValue までの距離を表示します。

SELECT ID, PointValue.ToString() AS Pnt,  
   PointValue.DistanceFrom(CONVERT(Point, '1,99')) AS DistanceFromPoint  
FROM dbo.Points;  

結果には、テーブル内の各行の DistanceFrom メソッドの結果が表示されます。

ID Pnt DistanceFromPoint  
-- --- -----------------  
 1 3,4  95.0210502993942  
 2 1,5                94  
 3 1,9                90  

DistanceFromXY メソッドは、ポイントを引数として個別に受け取ります。

SELECT ID, PointValue.X as X, PointValue.Y as Y,   
PointValue.DistanceFromXY(1, 99) AS DistanceFromXY   
FROM dbo.Points  

結果セットは DistanceFrom メソッドと同じです。

UDT 列のデータの更新

UDT 列のデータを更新するには、Transact-SQL UPDATE ステートメントを使用します。 また、UDT のメソッドを使用して、オブジェクトの状態を更新することもできます。 次の Transact-SQL ステートメントは、テーブル内の 1 つの行を更新します。

UPDATE dbo.Points  
SET PointValue = CAST('1,88' AS Point)  
WHERE ID = 3  

また、UDT の要素を個別に更新することもできます。 次の Transact-SQL ステートメントでは、Y 座標のみが更新されます。

UPDATE dbo.Points  
SET PointValue.Y = 99  
WHERE ID = 3  

バイト順序が true に設定された UDT が定義されている場合、Transact-SQL は WHERE 句で UDT 列を評価できます。

UPDATE dbo.Points  
SET PointValue = '4,5'  
WHERE PointValue = '3,4';  

更新の制限事項

Transact-SQL を使用して一度に複数のプロパティを更新することはできません。 たとえば、次の UPDATE ステートメントは、1 つの UPDATE ステートメントで同じ列名を 2 回使用できないため、エラーで失敗します。

UPDATE dbo.Points  
SET PointValue.X = 5, PointValue.Y = 99  
WHERE ID = 3  

座標の値を個別に更新するには、Point UDT のアセンブリにミューテーター メソッドを作成する必要があります。 その後、ミューテーター メソッドを呼び出して、次のように Transact-SQL UPDATE ステートメントのオブジェクトを更新できます。

UPDATE dbo.Points  
SET PointValue.SetXY(5, 99)  
WHERE ID = 3  

UDT 列のデータの削除

UDT 内のデータを削除するには、Transact-SQL DELETE ステートメントを使用します。 次のステートメントでは、WHERE 句で指定した条件に一致するテーブル内のすべての行が削除されます。 DELETE ステートメントで WHERE 句を省略すると、テーブル内のすべての行が削除されます。

DELETE FROM dbo.Points  
WHERE PointValue = CAST('1,99' AS Point)  

UDT 列の値を削除し、それ以外の行の値については現状維持する場合は、UPDATE ステートメントを使用します。 次の例では、PointValue に NULL を設定します。

UPDATE dbo.Points  
SET PointValue = null  
WHERE ID = 2  

参照

SQL Server でのユーザー定義型の使用