使用使用者定義型別 - 操作 UDT 資料
適用於:SQL Server
當修改使用者定義類型中的資料時,Transact-SQL 不會提供 INSERT、UPDATE 或 DELETE 子句的特製化語法, (UDT) 資料行。 Transact-SQL CAST 或 CONVERT 函式是用來將原生資料類型轉換成 UDT 類型。
將資料插入 UDT 資料行
下列 Transact-SQL 語句會將三個範例資料列插入 Points 資料表。 Point資料類型包含 X 和 Y 整數值,這些值會公開為 UDT 的屬性。 您必須使用 CAST 或 CONVERT 函數,將逗號分隔的 X 和 Y 值轉換成 Point 類型。 前兩個語句會使用 CONVERT 函數將字串值轉換成 Point 類型,而第三個語句則使用 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 語句會使用 SELECT 而非 SET 來進行變數指派,以達到相同的結果:
DECLARE @PointValue Point;
SELECT @PointValue = PointValue FROM dbo.Points
WHERE ID = 2;
SELECT @PointValue.ToString() AS PointValue;
使用 SELECT 與 SET 進行變數指派的差異在於,SELECT 可讓您在一個 SELECT 陳述式中指派多個變數,而 SET 語法要求每個變數指派都具有自己的 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、DistanceFrom和DistanceFromXY。 如需定義這三種方法的程式代碼清單,請參閱 撰寫程式碼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 語句會更新資料表中的單一資料列:
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 語句失敗並出現錯誤,因為您無法在一個 UPDATE 語句中使用相同的資料行名稱兩次。
UPDATE dbo.Points
SET PointValue.X = 5, PointValue.Y = 99
WHERE ID = 3
若要個別更新每個點,您需要在 Point UDT 組件中建立 Mutator 方法。 接著,您可以叫用 Mutator 方法來更新 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
另請參閱
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應