共用方式為


使用使用者定義的類型 - 操作 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 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 中的值。 如需詳細資訊,請參閱 建立使用者定義類型

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、DistanceFromDistanceFromXY。 如需定義這三種方法的程式代碼清單,請參閱 撰寫使用者定義型別的程序代碼。

下列 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  

另請參閱

在 SQL Server 中使用使用者定義型別