为什么在调用函数时必须使用模式前缀 (dbo)?

Raj*_*jan 10 sql-server functions

当用户使用默认架构 (dbo) 映射时,我们可以选择 [dbo] 下的所有表,而无需为架构添加前缀。

如果它在默认模式下,我们可以执行没有前缀的存储过程。

鉴于此,为什么我们需要使用模式为函数添加前缀?

谢谢!

Sha*_*nky 11

那为什么我们可以调用dbo下创建的不带前缀的函数(schema)呢?

来自UDF 上的 Books Online 文档

可以在使用标量表达式的地方调用标量值函数。这包括计算列和 CHECK 约束定义。也可以使用 EXECUTE 语句执行标量值函数。必须至少使用函数的两部分名称来调用标量值函数

所以这基本上是 SQL Server 开发团队设置的限制,我认为它非常正确。即使以某种方式允许(只是为了对话),我仍然会使用 Schema 前缀。

我总是支持使用模式名称,即使它不添加也能工作。这是最佳实践,所有“优秀”的开发人员都会使用它,无论它有多少冗余。

我看到的另一个原因是,数据库引擎需要一些东西来区分系统功能getdate ()和用户定义的功能。如果允许您在没有模式名称的情况下调用函数,数据库引擎将如何区分用户创建的名为 Getdate 的函数或系统 GETDATE() 函数。


Mar*_*ith 11

另一个答案解释说这是一个限制,但不是原因。

该要求并不总是正确的。标量 UDF 可以被EXEC-ed 并仍然使用隐式解析(示例

我想这是为了避免命名冲突。

如果允许在没有模式的情况下引用函数,那么crypt_gen_random在 2000 年或 2005 年创建自己的函数的人会遇到升级到更高版本的问题,因为这在 2008 年成为内置函数的名称。

exec用法没有歧义,因为内置函数不能这样调用。

  • @拉杰什。以 sp_ 开头的对象是特殊情况,总是在主/资源数据库中查找。并且有记录表明应该避免使用此前缀。内置函数没有这样的约定。 (3认同)