操作使用者定義類型 (UDT) 數據
適用於:SQL Server
Transact-SQL 在修改使用者定義類型 (UDT) 資料行中的數據時,不會提供 INSERT
、UPDATE
或 DELETE
語句的特殊語法。 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 AS 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 AS Point;
SELECT @PointValue = PointValue
FROM dbo.Points
WHERE ID = 2;
SELECT @PointValue.ToString() AS PointValue;
使用變數指派 SELECT
和 SET
之間的差異在於,SELECT
可讓您在一個 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
。 如需定義這三種方法的程式代碼清單,請參閱 使用 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 語句會更新資料表中的單一數據列:
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 dbo.Points
WHERE PointValue = CAST ('1,99' AS Point);
如果您想要移除 UDT 資料行中的值,同時讓其他數據列值保持不變,請使用 UPDATE
語句。 本範例會將 PointValue
設定為 null。
UPDATE dbo.Points
SET PointValue = NULL
WHERE ID = 2;
相關內容
- 在 SQL Server 中使用使用者定義的類型