当用户使用默认架构(dbo)映射时,我们可以选择[dbo]下的所有表而无需在架构前添加前缀。
如果存储过程在默认模式下,我们可以不带前缀地执行存储过程。
鉴于此,为什么我们需要在函数之前加上模式?
谢谢!
当用户使用默认架构(dbo)映射时,我们可以选择[dbo]下的所有表而无需在架构前添加前缀。
如果存储过程在默认模式下,我们可以不带前缀地执行存储过程。
鉴于此,为什么我们需要在函数之前加上模式?
谢谢!
Answers:
那么,为什么我们可以调用在dbo下创建的不带前缀(模式)的函数呢?
在使用标量表达式的地方,可以调用标量值的函数。这包括计算列和CHECK约束定义。标量值函数也可以通过使用EXECUTE语句执行。标量值函数必须至少使用函数的两部分名称来调用。
因此,这基本上是SQL Server开发团队设置的限制,我认为这是非常正确的。即使允许(出于对话目的),我仍将使用Schema前缀。
我始终支持使用架构名称,即使不添加它也可以使用。这是最佳做法,无论有多少冗余,所有“优秀”开发人员都将使用它。
我看到的另一个原因是,数据库引擎需要一些东西来区分类似系统功能getdate ()
和用户定义的功能。如果允许您不使用模式名称调用函数,那么数据库引擎将如何区分用户创建的名为Getdate的函数或系统的GETDATE()函数。
另一个答案说明这是一个限制,而不是原因。
该要求并不总是正确的。标量UDF可以被EXEC
-ed并仍然使用隐式分辨率(示例)
我想这是为了避免命名冲突。
如果允许在不使用模式的情况下引用函数,那么创建自己的函数(恰好crypt_gen_random
在2000或2005年被调用)的人会遇到升级到更高版本的问题,因为它在2008年成为内置函数的名称。
exec
内置函数的用法没有任何歧义,因此不能这样称呼。