考虑以下 T-SQL 语句:
create type mytype from decimal(8,3)
go
create function f (@x int)
returns mytype
with schemabinding
as
begin
return @x * @x
end
当我使用 SQL Server 2017 (v14.xx) 尝试此操作时,我收到此错误:
消息 2792,级别 16,状态 1,过程 f,第 6 行(批处理开始第 2 行)
无法在架构绑定对象或约束表达式中指定 SQL CLR 类型。
的文档create type
说明它
创建别名数据类型或用户定义类型 [in a database]。[...] 用户定义类型是通过 [CLR] 中的程序集类实现的。
这种听起来像是“用户定义的类型”和“CLR 类型”(如错误消息中所命名)可能只是同一事物的两个名称,但“别名数据类型”是(或可以是)别的东西。
我不想要任何 CLR 支持,我想做的只是给类型一个名称,以便它可以在多个函数定义和调用这些函数的任何代码中一致地使用。我想要模式绑定,因为它在使用这些函数的查询中产生了显着的性能改进。
如果我查找它已设置mytype
为1,但设置为 0。sys.types
is_user_defined
is_assembly_type
那么,“用户定义类型”和“CLR 类型”是同一事物的两个名称吗?“别名数据类型”有什么不同吗?它们似乎在create type
. 当它真的意味着任何用户定义的类型时,这个错误消息是否只是通过引用“CLR 类型”而令人困惑?
我可以做我想做的事还是必须放弃别名类型声明或模式绑定?