ユーザー定義型の使用 - UDT データの操作Working with User-Defined Types - Manipulating UDT Data

適用対象: yesSQL Server noAzure SQL Database noAzure Synapse Analytics (SQL DW) noParallel Data Warehouse APPLIES TO: yesSQL Server noAzure SQL Database noAzure Synapse Analytics (SQL DW) noParallel Data Warehouse

Transact-SQLTransact-SQL には、UDT (ユーザー定義型) 列のデータを変更する際に特別な INSERT、UPDATE、または DELETE ステートメント構文は用意されていません。provides no specialized syntax for INSERT, UPDATE, or DELETE statements when modifying data in user-defined type (UDT) columns. Transact-SQLTransact-SQL の CAST 関数または CONVERT 関数を使用して、ネイティブ データ型を UDT 型にキャストします。The Transact-SQLTransact-SQL CAST or CONVERT functions are used to cast native data types to the UDT type.

UDT 列へのデータの挿入Inserting Data in a UDT Column

Transact-SQLTransact-SQLステートメントにサンプル データの 3 つの行を挿入、ポイントテーブル。The following Transact-SQLTransact-SQL statements insert three rows of sample data into the Points table. ポイントデータ型は X と Y の整数値、UDT のプロパティとして公開されます。The Point data type consists of X and Y integer values that are exposed as properties of the UDT. CAST または CONVERT のいずれかの関数を使用して、コンマ区切りをキャストする必要があります X と Y 値をポイント型。You must use either the CAST or CONVERT function to cast the comma-delimited X and Y values to the Point type. 最初の 2 つのステートメントでは、CONVERT 関数を使用して、文字列値を変換、ポイント型、および 3 番目のステートメントは、CAST 関数を使用します。The first two statements use the CONVERT function to convert a string value to the Point type, and the third statement uses the CAST function:

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));  

データの選択Selecting Data

次の SELECT ステートメントでは、UDT のバイナリ値を選択します。The following SELECT statement selects the binary value of the UDT.

SELECT ID, PointValue FROM dbo.Points  

読みやすい形式で表示される出力を表示するを呼び出して、 ToStringのメソッド、ポイントUDT では、値を文字列表現に変換します。To see the output displayed in a readable format, call the ToString method of the Point UDT, which converts the value to its string representation.

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

これには、次の結果が生成されます。This produces the following results.

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

また、Transact-SQLTransact-SQL の CAST 関数や CONVERT 関数を使用して、同じ結果を得ることもできます。You can also use the Transact-SQLTransact-SQL CAST and CONVERT functions to achieve the same results.

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

ポイントUDT が個別に選択し、プロパティとして、X と Y 座標を公開します。The Point UDT exposes its X and Y coordinates as properties, which you can then select individually. 次の、Transact-SQLTransact-SQL ステートメントでは、X 座標と Y 座標を個別に選択します。The following Transact-SQLTransact-SQL statement selects the X and Y coordinates separately:

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

X プロパティと Y プロパティから整数値が返され、結果セットに表示されます。The X and Y properties return an integer value, which is displayed in the result set.

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

変数を使用した作業Working with Variables

変数を使用するには、DECLARE ステートメントを使用して、UDT 型にその変数を割り当てます。You can work with variables using the DECLARE statement to assign a variable to a UDT type. 次のステートメントを使用して値を割り当てる、Transact-SQLTransact-SQLステートメントを設定し、UDT を呼び出すことによって、結果を表示ToString変数メソッド。The following statements assign a value using the Transact-SQLTransact-SQL SET statement and display the results by calling the UDT's ToString method on the variable:

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

結果セットには、次のように変数の値が表示されます。The result set displays the variable value:

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

次の Transact-SQLTransact-SQL ステートメントでは、変数の代入で SET ステートメントの代わりに SELECT ステートメントを使用して、同じ結果を得ています。The following Transact-SQLTransact-SQL statements achieve the same result using SELECT rather than SET for the variable assignment:

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 ステートメントが必要になります。The difference between using SELECT and SET for variable assignment is that SELECT allows you to assign multiple variables in one SELECT statement, whereas the SET syntax requires each variable assignment to have its own SET statement.

データを比較します。Comparing Data

設定した場合、UDT の値を比較する比較演算子を使用することができます、 IsByteOrderedプロパティをtrueクラスを定義するときにします。You can use comparison operators to compare values in your UDT if you have set the IsByteOrdered property to true when defining the class. 詳細については、次を参照してください。ユーザー定義型を作成するします。For more information, see Creating a User-Defined Type.

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

関係なく、UDT の内部の値を比較することができます、 IsByteOrdered自体の値が比較可能な場合に設定します。You can compare internal values of the UDT regardless of the IsByteOrdered setting if the values themselves are comparable. 次の Transact-SQLTransact-SQL ステートメントでは、X の値が Y の値よりも大きい行を選択します。The following Transact-SQLTransact-SQL statement selects rows where X is greater than Y:

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

また、一致する PointValue を検索する次のクエリのように、変数と比較演算子を組み合わせて使用することもできます。You can also use comparison operators with variables, as shown in this query that searches for a matching PointValue.

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

UDT メソッドの呼び出しInvoking UDT Methods

Transact-SQLTransact-SQL でも、UDT で定義されているメソッドを呼び出すことができます。You can also invoke methods that are defined in your UDT in Transact-SQLTransact-SQL. ポイントクラスには、3 つのメソッドが含まれています。距離DistanceFrom、およびDistanceFromXYします。The Point class contains three methods, Distance, DistanceFrom, and DistanceFromXY. これら 3 つのメソッドを定義するコード リストを参照してください。 Coding User-Defined 型します。For the code listings defining these three methods, see Coding User-Defined Types.

Transact-SQLTransact-SQLステートメントの呼び出し、 PointValue.Distanceメソッド。The following Transact-SQLTransact-SQL statement calls the PointValue.Distance method:

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

結果が表示されます、距離列。The results are displayed in the Distance column:

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

DistanceFromメソッドの引数を受け取るポイントデータ型、および指定した点から PointValue までの距離が表示されます。The DistanceFrom method takes an argument of Point data type, and displays the distance from the specified point to the PointValue:

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

結果の結果を表示する、 DistanceFromテーブルの各行のメソッド。The results display the results of the DistanceFrom method for each row in the table:

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

DistanceFromXYメソッドは引数として個別にポイントを取得します。The DistanceFromXY method takes the points individually as arguments:

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

結果セットが同じ、 DistanceFromメソッド。The result set is the same as the DistanceFrom method.

UDT 列のデータの更新Updating Data in a UDT Column

UDT 列のデータを更新するには、Transact-SQLTransact-SQL の UPDATE ステートメントを使用します。To update data in a UDT column, use the Transact-SQLTransact-SQL UPDATE statement. また、UDT のメソッドを使用して、オブジェクトの状態を更新することもできます。You can also use a method of the UDT to update the state of the object. 次の Transact-SQLTransact-SQL ステートメントでは、テーブルの単一行を更新します。The following Transact-SQLTransact-SQL statement updates a single row in the table:

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

また、UDT の要素を個別に更新することもできます。You can also update UDT elements separately. 次の Transact-SQLTransact-SQL ステートメントでは、Y 座標の値のみを更新します。The following Transact-SQLTransact-SQL statement updates only the Y coordinate:

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

バイト オーダーに設定すると、UDT が定義されてかどうかtrueTransact-SQLTransact-SQL WHERE 句で UDT 列を評価することができます。If the UDT has been defined with byte ordering set to true, Transact-SQLTransact-SQL can evaluate the UDT column in a WHERE clause.

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

更新の制限事項Updating Limitations

Transact-SQLTransact-SQL を使用して、複数のプロパティを一度に更新することはできません。You cannot update multiple properties at once using Transact-SQLTransact-SQL. たとえば、1 つの UPDATE ステートメントでは同じ列名を 2 回使用することができないため、次のステートメントは失敗します。For example, the following UPDATE statement fails with an error because you cannot use the same column name twice in one UDATE statement.

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

座標の値を個別に更新するには、Point UDT のアセンブリにミューテーター メソッドを作成する必要があります。To update each point individually, you would need to create a mutator method in the Point UDT assembly. ミューテーター メソッドを作成すると、Transact-SQLTransact-SQL の UPDATE ステートメントでミューテーター メソッドを呼び出して、オブジェクトを更新することができます。次に、例を示します。You can then invoke the mutator method to update the object in a Transact-SQLTransact-SQL UPDATE statement, as in the following:

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

UDT 列のデータの削除Deleting Data in a UDT Column

UDT のデータを削除するには、Transact-SQLTransact-SQL の DELETE ステートメントを使用します。To delete data in a UDT, use the Transact-SQLTransact-SQL DELETE statement. 次のステートメントでは、WHERE 句で指定した条件に一致するテーブル内のすべての行が削除されます。The following statement deletes all rows in the table that match the criteria specified in the WHERE clause. DELETE ステートメントで WHERE 句を省略すると、テーブル内のすべての行が削除されます。If you omit the WHERE clause in a DELETE statement, all rows in the table will be deleted.

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

UDT 列の値を削除し、それ以外の行の値については現状維持する場合は、UPDATE ステートメントを使用します。Use the UPDATE statement if you want to remove the values in a UDT column while leaving other row values intact. 次の例では、PointValue に NULL を設定します。This example sets the PointValue to null.

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

参照See Also

SQL Server でのユーザー定義型の使用Working with User-Defined Types in SQL Server