次の方法で共有


ユーザー定義型 (UDT) データを操作する

適用対象:SQL Server

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

UDT 列にデータを挿入する

次の Transact-SQL ステートメントは、Points テーブルに 3 行のサンプル データを挿入します。 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 AS 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 AS Point;

SELECT @PointValue = PointValue
FROM dbo.Points
WHERE ID = 2;

SELECT @PointValue.ToString() AS PointValue;

変数の割り当てに SELECTSET を使用する場合の違いは、SELECT では 1 つの SELECT ステートメントで複数の変数を割り当てることができますが、SET 構文では各変数の代入に独自の SET ステートメントが必要です。

データの比較

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

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 AS Point;
SET @ComparePoint = CONVERT (Point, '3,4');

SELECT ID, PointValue.ToString() AS MatchingPoint
FROM dbo.Points
WHERE PointValue = @ComparePoint;

UDT メソッドを呼び出す

Transact-SQL で UDT で定義されているメソッドを呼び出すこともできます。 Point クラスには、DistanceDistanceFrom、および DistanceFromXYの 3 つのメソッドが含まれています。 これら 3 つのメソッドを定義するコード一覧については、「ADO.NETを使用したユーザー定義型の作成」参照してください。

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

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

結果は Distance 列に表示されます。

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;

UDT がバイト順序を trueに設定して定義されている場合、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 dbo.Points
WHERE PointValue = CAST ('1,99' AS Point);

UDT 列の値を削除し、他の行の値をそのまま残す場合は、UPDATE ステートメントを使用します。 次の使用例は、PointValue を null に設定します。

UPDATE dbo.Points
SET PointValue = NULL
WHERE ID = 2;
  • SQL Server でユーザー定義型を操作する