SQL Server架构绑定用户自定义函数能否使用别名类型?
概念澄清
- 广义的「用户自定义类型(UDT)」包含两类完全不同的类型:
- 别名数据类型:就是你通过
create type 别名 from 基础类型语法创建的类型,本质是系统内置类型的别名,没有自定义逻辑,sys.types中对应is_assembly_type=0 - CLR用户自定义类型:基于.NET程序集实现的自定义类型,支持自定义方法、行为,依赖SQL Server的CLR集成功能,
sys.types中对应is_assembly_type=1
所以「用户自定义类型」和「CLR类型」不是同一概念,CLR类型只是用户自定义类型的一个子集,别名数据类型是用户自定义类型的另一个子集。
- 别名数据类型:就是你通过
报错原因
你遇到的报错属于SQL Server历史遗留的文本表述歧义,报错提示里的「SQL CLR类型」是表述错误,实际指代所有非系统内置的用户自定义类型(包含别名类型),和你有没有开启CLR支持没有关系。
功能限制说明
目前所有主流SQL Server版本(包括2017、2022)均不支持在架构绑定的对象(架构绑定函数、视图、约束表达式)中使用别名数据类型,两个功能无法同时启用。
可选折中方案
- 优先保留架构绑定的性能收益:放弃使用别名类型,所有用到该类型的位置直接声明
decimal(8,3),可以通过代码规范、全局替换的方式保证所有位置的类型统一,改造成本很低。 - 优先保留别名类型的统一管理能力:去掉函数定义中的
WITH SCHEMABINDING参数,需要提前评估去掉架构绑定带来的性能损失是否符合业务要求。
内容的提问来源于stack exchange,提问作者Kevin Martin
相关产品推荐
相关产品推荐

