在SQL Server中对函数名称使用前缀(例如fn_GetName)的充分理由的示例是什么?似乎没有必要,因为通常使用它的上下文会清楚它是一个函数。我还没有使用任何其他需要函数前缀的语言,我想不出一个好的场景可以说明为什么SQL会有所不同。
我唯一的想法是,也许在较旧的IDE中,当数据库对象全部列在一起时,将函数分组在一起很有用,但现代IDE已经明确了什么是函数。
答案 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。