为什么要输入sql函数名?

Aar*_*nLS 13 sql t-sql sql-server naming-conventions

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

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

gbn*_*gbn 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()
Run Code Online (Sandbox Code Playgroud)

如果你使用复数来表示一个表值函数,这可能会更糟

SELECT dbo.GetName() FROM MyTable
SELECT * FROM dbo.GetNames()
Run Code Online (Sandbox Code Playgroud)

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

SELECT dbo.sfnGetName() FROM MyTable
SELECT * FROM dbo.tfnGetName()
Run Code Online (Sandbox Code Playgroud)

使用架构.并没有名称含糊不清.

SELECT ScalarFN.GetName() FROM MyTable
SELECT * FROM TableFN.GetName()
Run Code Online (Sandbox Code Playgroud)

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

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


Jon*_*ler 6

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


小智 5

什么是例证使用前缀的充分理由的方案

空无一人。人们之所以会做各种各样的事情,是因为他们总是这样做,并且用多年错误的古老知识解释了许多不良习惯。


Rem*_*anu 5

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

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

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