跨数据库使用用户定义类型
创建用户定义类型后,它对于单个数据库而言是本地的。因此,在一个数据库中定义的用户定义类型不能用在其他数据库的列定义中。但是,如果在两个数据库中注册相同的用户定义类型,并且均可从中访问它,则可以将一个数据库的用户定义类型值进行转换,用于另一个数据库。在您执行下列操作时,此功能非常有用:
- 调用其他数据库中定义的存储过程。
- 查询在两个不同的数据库中定义的表。
- 从一个数据库中选择数据并将它插入到其他数据库。
例如,假设在数据库 db1 和数据库 db2 中都创建了用户定义类型 u1。但仅在数据库 db2 中创建了接受 u1 类型参数的存储过程 p2。您可以使用存储过程 p2 调用数据库 db1 中的 u1 类型的实例。
USE db1
DECLARE @u u1
EXEC db2.dbo.p2 @u
GO
还有一个示例是有关用查询结果填充 tempdb 中的临时表的。要使此操作成功,就必须在 tempdb 中注册用户定义类型。
INSERT INTO #t SELECT * FROM T
在表变量中使用用户定义类型时,或游标使用工作表中的用户定义类型时,不需要在 tempdb 中注册用户定义类型。
当您跨数据库使用用户定义类型时,应该记住下列事项:
- 类型必须具有相同的名称(包括相同 CLR 名称),且必须在两个数据库中通过相同的程序集来实现。两个数据库中的程序集相同的条件是:具有相同的名称、强名称、区域性、版本、代码访问权限集以及二进制内容。
- 您必须具有对查询中引用的每个用户定义类型列的 SELECT 和 EXECUTE 权限。这些权限将根据定义各列的数据库进行检查。
- 如果某个程序集中实现的类型调用了其他程序集中的方法,将检查跨程序集调用,检查方式就像没有跨数据库发出用户定义类型的查询一样。