使用用户定义类型 - 操作 UDT 数据

适用于:SQL Server

修改用户定义类型中的数据 (UDT) 列时,Transact-SQL 没有为 INSERT、UPDATE 或 DELETE 语句提供专用语法。 Transact-SQL CAST 或 CONVERT 函数用于将本机数据类型强制转换为 UDT 类型。

在 UDT 列中插入数据

以下 Transact-SQL 语句将三行示例数据插入 Points 表中。 Point 数据类型由作为 UDT 属性公开的 X 和 Y 整数值组成。 必须使用 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;  

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

如果值本身可比较,则可以比较 UDT 的内部值,而不考虑 IsByteOrdered 设置。 以下 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 类包含三种方法:DistanceDistanceFromDistanceFromXY。 有关定义这三种方法的代码列表,请参阅 编码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  

如果在将字节顺序设置为 true 的情况下定义了 UDT,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 方法来更新 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 中的用户定义类型