使用用户定义类型 - 操作 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 中的值。 有关详细信息,请参阅 创建用户定义的类型。
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。 有关定义这三种方法的代码列表,请参阅 编码用户定义类型。
以下 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 方法来更新 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