为什么要输入sql函数名?

时间:2010-12-28 18:57:25

标签: sql sql-server tsql naming-conventions

在SQL Server中对函数名称使用前缀(例如fn_GetName)的充分理由的示例是什么?似乎没有必要,因为通常使用它的上下文会清楚它是一个函数。我还没有使用任何其他需要函数前缀的语言,我想不出一个好的场景可以说明为什么SQL会有所不同。

我唯一的想法是,也许在较旧的IDE中,当数据库对象全部列在一起时,将函数分组在一起很有用,但现代IDE已经明确了什么是函数。

9 个答案:

答案 0 :(得分:17)

你对旧的IDE是正确的

作为一名DBA,尝试使用SQL Server企业管理器(SQL Server 2000和7.0)修复权限时,尝试查看权限是完全错误的。如果您使用了ufn或usp或vw,由于GUI如何呈现数据,因此将事物组合在一起变得更容易。

说,如果你有SELECT * FROM Thing,那是什么东西?一个视图还是一个表?它可能对您作为开发人员有用,但在部署时会崩溃,因为您没有授予对表本身的权限:只有视图或过程。当然vwThing会使你的血压下降......?

如果你使用模式,那就变得无关紧要了。您可以“命名”您的对象。例如,“数据”中的表和其他模式中每个客户端的其他对象,例如WebGUI

编辑:

功能。您有表值和标量函数。如果你坚持代码“VerbNoun”的概念,你怎么知道哪一个没有其他线索。 (当然,这不可能发生,因为对象名称是唯一的)

SELECT dbo.GetName() FROM MyTable
SELECT * FROM dbo.GetName()

如果使用复数表示表值函数,这可能会更糟糕

SELECT dbo.GetName() FROM MyTable
SELECT * FROM dbo.GetNames()

虽然这不那么模棱两可,虽然冒犯了一些人; - )

SELECT dbo.sfnGetName() FROM MyTable
SELECT * FROM dbo.tfnGetName()

使用架构。没有名字含糊不清。

SELECT ScalarFN.GetName() FROM MyTable
SELECT * FROM TableFN.GetName()

您的“任何其他语言”评论不适用。 SQL的结构不像c#,Java,f#,Ada(好的,PL / SQL可能是),VBA,等等:没有对象或命名空间层次结构。没有Object.DoStuff方法的东西。

前缀可能只是让你保持理智...

答案 1 :(得分:5)

除了需要使用fn_(我见过的惯例)为表名添加前缀之外,不需要使用t_为函数名添加前缀。这种系统前缀倾向于被那些对语言不熟悉且需要约定的人们使用,作为理解代码的额外帮助。

答案 2 :(得分:5)

与所有命名约定一样,约定实际上并不重要。真正重要的是一致。因此,即使惯例是错误的,坚持它以保持一致性仍然很重要。是的,可能有人认为,如果命名约定是错误的,那么它应该被更改,但是工作意味着很多:重命名所有对象,更改源代码,所有维护过程,让开发团队提交遵循新的惯例,所有的支持和操作人员都遵循新规则等。在一个大型组织中,改变既定命名惯例的努力只是压倒一切。

我不知道你的情况是什么,但在为了'漂亮'而提出命名约定之前你应该仔细考虑。无论你的组织中现有的命名约定有多糟糕,坚持它并保持命名一致性要好于忽略它并开始自己的命名约定。

当然,通常情况下,命名约定不仅很糟糕,也没有遵循,名称​​ 不一致。在那种情况下,糟透了...

答案 3 :(得分:4)

  

什么是举例说明的情景   有充分理由使用前缀

没有。人们会做各种各样的事情,因为他们总是这样做,而且许多不良习惯都用多年来错误的古老知识来解释。

答案 4 :(得分:2)

我不是前缀的粉丝,但也许一个优点可能是这些fn_前缀可能更容易识别特定函数是用户定义的,而不是内置的。

答案 5 :(得分:2)

我们公司在这方面遇到了很多痛苦的会议。 IMO,我们不需要任何对象名称的前缀。但是,如果视图的名称可能与基础表名冲突,则可以将它们放在视图上。

在任何情况下,没有SQL要求使用前缀,坦率地说,IMO,它们没有实际价值。

答案 6 :(得分:2)

正如其他人所注意到的那样,您定义的任何场景都很容易受到质疑,因此没有规则可以根据需要对其进行定义;然而,同样没有规则说这也是不必要的。与所有命名惯例一样,拥有一致的使用而非理由更为重要。

答案 7 :(得分:1)

我能想到的一个(也是唯一的)优势是它因此应用的前缀方案可以更容易地使用智能感知/自动完成,因为相关的功能是自动组合在一起的。

答案 8 :(得分:1)

由于我最近偶然发现了这个问题,我想添加以下几点来支持前缀:想象一下,你有一些来自某个系统表的对象id,你想确定它是一个函数,proc,view等当然,您可以为每种类型运行测试,但是从对象名称中提取前缀然后对此进行操作会更容易。当您使用下划线将前缀与名称分开时,这会变得更加容易,例如: usp_Foo而不是uspFoo。恕我直言,这不仅仅是关于愚蠢的IDE。