使用和修改用户定义类型的实例

您可以按下列方式使用用户定义类型:

  • 创建具有用户定义类型列的表

  • 插入和修改用户定义类型的列值

  • 将用户定义类型用作变量或参数

创建具有用户定义类型列的表

通过提供列名并引用类型名称,便可创建具有用户定义类型列的表。这种方式与创建由基于系统的数据类型或别名类型所组成的列的方式类似。若要创建公共语言运行时 (CLR) 用户定义类型的列,您必须对此类型具有 REFERENCES 权限。

创建具有用户定义类型列的表

插入和修改用户定义类型的列值

您可以插入和修改列值,以及更改用户定义类型的变量和参数的值。

注意注意

用户定义类型创建后便不能修改,因为更改会使表或索引中的数据失效。若要修改类型,必须删除该类型,然后再重新创建,或者使用 WITH UNCHECKED DATA 子句发出 ALTER ASSEMBLY 语句。有关详细信息,请参阅 ALTER ASSEMBLY (Transact-SQL)

通过执行下列操作,可以插入或修改用户定义类型的列值:

  • 提供 SQL Server 系统数据类型的值,条件是该用户定义类型支持该类型的隐式转换或显式转换。下面的示例显示如何通过从字符串显式转换来更新用户定义类型 Point 的列中的值:

    UPDATE Cities
    SET Location = CONVERT(Point, '12.3:46.2')
    WHERE Name = 'Anchorage'
    
  • 调用标记为“赋值函数”的用户定义类型的方法执行更新。下面的示例调用类型 point 的赋值函数方法,该方法称为 SetXY,用于更新类型实例的状态:

    UPDATE Cities
    SET Location.SetXY(23.5, 23.5)
    WHERE Name = 'Anchorage'
    
    注意注意

    如果针对 Transact-SQL 空值调用“赋值函数”方法,或者如果“赋值函数”方法产生的新值为空,则 SQL Server 将会返回错误。

  • 修改用户定义类型的属性或公共字段的值。提供值的表达式必须可以隐式地转换为该属性类型。下面的示例修改用户定义类型 point 的属性 X 的值:

    UPDATE Cities
    SET Location.X = 23.5
    WHERE Name = 'Anchorage'
    

    若要修改同一用户定义类型列的不同属性,请发出多个 UPDATE 语句,或者调用此类型的“赋值函数”方法。

下面的示例将类型 Point 的值插入表中:

INSERT INTO Cities (Name, Location)
VALUES ('Anchorage', CONVERT(Point, '23.5, 23.5'))

将用户定义类型的值插入到表或视图中

UPDATE (Transact-SQL)

将用户定义类型用作变量或参数

您可以将 Transact-SQL 变量、Transact-SQL 参数或者 Microsoft .NET Framework 函数或过程的参数声明为用户定义类型。应遵循以下规则:

  • 您必须对该类型具有 EXECUTE 权限。

  • 如果想要创建的函数、存储过程或触发器包含具有架构绑定的用户定义类型声明,则您必须具有该类型的 REFERENCES 权限。

如果使用的名称仅包含一个部分,则 SQL Server 将会按照以下顺序查找类型引用:

  1. 当前数据库中当前用户的架构。

  2. 当前数据库中的 dbo 架构。

  3. 系统本机类型空间。

声明用户定义类型作为函数或过程的 Transact-SQL 变量或参数

使用用户定义类型的限制

在创建和使用用户定义类型时,请注意下列事项:

  • 在 SQL Server 中创建用户定义类型时,无法定义长度、小数位数、精度或其他元数据。

  • 列、变量或参数不能声明为在其他数据库中定义的用户定义类型。有关详细信息,请参阅跨数据库使用用户定义类型

  • 若要确定某个用户定义类型是否等同于先前定义的类型,请不要比较类型 ID,因为类型 ID 仅在用户定义类型的生存期间有效,并且可以回收。此时应比较 CLR 类型名称、四部分程序集名称以及程序集字节。

  • sql_variant 列不能包含用户定义类型的实例。

  • 在 CLR 过程、函数、触发器或分区函数中,不能将用户定义类型用作默认值。

  • 用户定义类型无法在 table 变量的计算列中引用。