ユーザー定義型の使用 - UDT データの操作
適用対象: SQL サーバー
Transact-SQL では、ユーザー定義型 (UDT) 列のデータを変更するときに、INSERT、UPDATE、または DELETE ステートメントの特殊な構文は提供されません。 Transact-SQL CAST または CONVERT 関数は、ネイティブ データ型を UDT 型にキャストするために使用されます。
UDT 列へのデータの挿入
次の Transact-SQL ステートメントは、 Points テーブルに 3 行のサンプル データを挿入します。 Point データ型は、UDT のプロパティとして公開される X および Y の整数値で構成されます。 CAST 関数または CONVERT 関数を使用して、コンマ区切りの X 値と Y 値を Point 型にキャストする必要があります。 最初の 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 内の値を比較できます。 詳細については、「 ユーザー定義型の作成」を参照してください。
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、DistanceFrom、および DistanceFromXY の 3 つのメソッドが含まれています。 これら 3 つのメソッドを定義するコード一覧については、「ユーザー定義型のコーディングを参照してください。
次の 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 FROM dbo.Points
WHERE PointValue = CAST('1,99' AS Point)
UDT 列の値を削除し、それ以外の行の値については現状維持する場合は、UPDATE ステートメントを使用します。 次の例では、PointValue に NULL を設定します。
UPDATE dbo.Points
SET PointValue = null
WHERE ID = 2