实现用户定义类型

更新日期: 2006 年 4 月 14 日

本主题说明如何在 SQL Server 中创建和删除公共语言运行时 (CLR) 用户定义类型。

创建用户定义类型

若要在 SQL Server 中创建用户定义类型,必须按顺序执行下列步骤:

  • 使用 Microsoft .NET Framework 支持的语言将用户定义类型定义为类或结构。有关如何在 CLR 中编写类型的详细信息,请参阅 CLR User-Defined Types。然后,编译类或结构以在 .NET Framework 中使用相应的语言编译器生成程序集。
  • 使用 CREATE ASSEMBLY 语句在 SQL Server 中注册程序集。有关 SQL Server 中的程序集的详细信息,请参阅程序集(数据库引擎)
  • 创建引用注册程序集的类型。
ms179298.note(zh-cn,SQL.90).gif注意:
在 Microsoft Visual Studio 中部署 SQL Server 项目将在为该项目指定的数据库中注册程序集。部署项目时还会在数据库中为使用 SqlUserDefinedType 属性批注的全部类定义创建 CLR 用户定义类型。有关详细信息,请参阅Deploying CLR Database Objects
ms179298.note(zh-cn,SQL.90).gif注意:
默认情况下,SQL Server 执行 CLR 代码的功能设置为 OFF。您可以创建、修改和删除引用托管代码模块的数据库对象,但是这些引用不会在 SQL Server 中执行,除非已使用 sp_configure 启用了 clr enabled 选项

创建、修改或删除程序集

创建用户定义类型

删除用户定义类型

删除用户定义类型

ms179298.note(zh-cn,SQL.90).gif注意:
用户定义类型在创建后不能被修改,因为修改可能会使表或索引中的数据无效。若要修改类型,必须删除并重新创建该类型,或者使用 WITH UNCHECKED DATA 子句发出 ALTER ASSEMBLY 语句。

在删除所有对用户定义类型的引用之前,不能删除该类型。这些引用可能包括:

  • 针对该类型定义的列。
  • 其表达式引用该类型的计算列和 CHECK 约束。
  • 其定义中具有引用该类型的表达式的绑定到架构的视图和函数。
  • 函数参数和存储过程参数。

查找依赖于用户定义类型的列

以下示例检索有关针对用户定义类型 ComplexNumber 定义的列的元数据。

SELECT * FROM sys.columns 
WHERE user_type_id = TYPE_ID('ComplexNumber');

以下示例为最少特权用户检索有关针对用户定义类型 ComplexNumber 定义的列的有限元数据。

SELECT * FROM sys.column_type_usages 
WHERE user_type_id = TYPE_ID('ComplexNumber');

查找依赖于用户定义类型的计算列表达式、CHECK 约束表达式以及绑定到架构的视图和函数的表达式

以下示例检索依赖于用户定义类型 ComplexNumber 的计算列(及其表)的名称。

SELECT OBJECT_NAME(object_id) AS object_name,
    COL_NAME(object_id, column_id) AS column_name
FROM sys.sql_dependencies
WHERE referenced_major_id = TYPE_ID('ComplexNumber')
    AND class = 2 
    AND OBJECTPROPERTY(object_id, 'IsTable')=1; 

以下示例检索依赖于用户定义类型 ComplexNumber 的 CHECK 约束(以及针对其定义约束的对象)的名称。

SELECT SCHEMA_NAME(o.schema_id) AS schema_name,
    OBJECT_NAME(o.parent_object_id) AS table_name,
    OBJECT_NAME(o.object_id) AS constraint_name
FROM sys.sql_dependencies AS d
JOIN sys.objects AS o
ON o.object_id = d.object_id
WHERE referenced_major_id = TYPE_ID('ComplexNumber')
AND class = 2 
AND OBJECTPROPERTY(o.object_id, 'IsCheckCnst')=1;

以下示例检索其定义引用用户定义类型 ComplexNumber 的绑定到架构的函数和视图的名称。

ms179298.note(zh-cn,SQL.90).gif注意:
SQL Server 不维护用户定义类型及其在存储过程、触发器、非架构绑定的函数或非架构绑定的视图的正文中使用之间的依赖关系元数据。
SELECT SCHEMA_NAME(o.schema_id) AS dependent_object_schema,
    OBJECT_NAME(o.object_id) AS dependent_object_name,
    o.type_desc AS dependent_object_type,
    d.class_desc AS kind_of_dependency,
    d.referenced_major_id AS referenced_object
FROM sys.sql_dependencies AS d 
JOIN sys.objects AS o
    ON d.object_id = o.object_id
        AND o.type IN ('FN','IF','TF', 'V')
WHERE  d.class = 2
    AND d.referenced_major_id IN (TYPE_ID('ComplexNumber'))
ORDER BY dependent_object_schema, dependent_object_name;

查找依赖于用户定义类型的参数

以下示例检索针对用户定义类型 ComplexNumber 定义的参数(及其所属对象)的名称。

SELECT OBJECT_NAME(object_id) AS object_name,
    NULL AS procedure_number,
    name AS param_name,
    parameter_id AS param_num,
    TYPE_NAME(p.user_type_id) AS type_name
FROM sys.parameters AS p
WHERE p.user_type_id = TYPE_ID('ComplexNumber')
ORDER BY object_name, procedure_number, param_num;

以下示例为最少特权用户检索有关针对用户定义类型 ComplexNumber 定义的参数的有限元数据。

SELECT * FROM sys.parameter_type_usages 
WHERE user_type_id = TYPE_ID('ComplexNumber');

请参阅

概念

使用 CLR 用户定义类型

其他资源

CLR 可编程性示例

帮助和信息

获取 SQL Server 2005 帮助

更改历史记录

发布日期 历史记录

2006 年 4 月 14 日

新增内容:
  • 为“删除用户定义类型”部分添加了有关查找用户定义类型的依赖关系的信息。