ユーザー定義型 (UDT) データを操作する
適用対象:SQL Server
Transact-SQL では、ユーザー定義型 (UDT) 列のデータを変更するときに、INSERT
、UPDATE
、または 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;
変数の割り当てに SELECT
と SET
を使用する場合の違いは、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
クラスには、Distance
、DistanceFrom
、および 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 でユーザー定義型を操作する