T-SQL中存储过程命名的最佳实践是什么?

25

我曾经使用过多个大型数据库,存储过程的名称差异很大:

SP_PrefixXXX
PrefixYyyXxx
Prefix: Rep, Act

命名的最佳实践是什么?我该如何以正确的方式组织它们?


参见:https://dev59.com/e3VC5IYBdhLWcg3wnCf6?noredirect=1#comment22043254_238267 - DOK
11个回答

52

sp_前缀代表系统存储过程,不应该作为普通存储过程的前缀。如果这样做,每次都会额外访问master数据库来查找该存储过程,如果它与其中一个存储过程同名,则将执行那个存储过程而不是你的存储过程。

除此之外,您可以自由地制定任何命名约定。我们公司使用的是子系统_对象_动作的格式,例如main_Customer_Get。这将把属于同一组的存储过程放在列表中接近一起。


我们在这里使用类似的东西,只不过“Get”通常会包括更多的描述,例如:main_Customer_Get_By_ID。 - Tom H
@Tom:如果愿意,可以认为通过id获取已经隐含在“Get”中了,但是当然还有其他需要更长的描述的操作,比如main_Customer_GetByRegion。正如你所看到的,我们更喜欢使用下划线来分隔名称的组成部分,并使用帕斯卡命名法来命名表格和操作。 - Guffa
5
我在 SQL Server 2008R2 上测试了你的“它将首先前往主数据库”的方法:
  1. 在我的数据库和主数据库中创建了 sp_Mine 存储过程,前者输出“mine#1”,后者输出“master#2”。
  2. 在我的数据库中运行该存储过程,并获得“mine#1”的输出!如果 SQL Server 首先访问主数据库,我本来预期会找到其他存储过程并输出“master#2”。
  3. 但当我创建了一个名为“sp_autostats”的存储过程时(与主数据库中的系统存储过程同名),在这种情况下它调用了主数据库中的存储过程。
也许你的说法只对主数据库中的 [sys] 存储过程有效?
- andreister

7

最佳的命名规范是在整个数据库中保持一致的规范 :)

实际上,这取决于您和您的团队。只要清晰明了且合理,您就有相当大的自由度。只需确保无论您决定使用什么规范,每个人都遵守它。比规范本身更重要的是每个人都坚持使用它。

我倾向于避免使用sp_、usp_等前缀,因为我认为它们是多余的。例如,名为InsertCustomer的存储过程显然是一个存储过程,绝不会被误认为是表、视图或任何其他类型的对象。特别应避免使用sp_前缀。

我更喜欢CamelCase,但这也是个人偏好的问题。我希望我的存储过程名称能够很好地说明存储过程所做的事情,例如:

InsertSalesOrder PopulateItemStagingTables CalculateOrderSummary PrepareCustomerStatements

等等。


3
请不要使用 sp_!这就像是说你的视图需要以 view_ 为前缀,或者你的表格需要以 table_ 为前缀......真的!元数据才是胜利之道。 - Rob Elsner
3
是不是指camelCase和PascalCase? - Mike Cole
是的,或者驼峰式大小写:'camel'因为它在中间有一个驼峰。 - ChrisW
是的,我认为你是对的。实际上,它是AaronCase - 我所使用的全部内容;-) - Aaron Alton

7

我喜欢为它们添加前缀,这样特定对象的SP就可以被分组在一起。所以,不是像下面这样写:

    InsertUser
    UpdateUser
    DeleteUser
    GetUsers

而是像这样写:

    AppName_User_GetUser
    AppName_User_InsertUser
    AppName_User_UpdateUser
    AppName_User_DeleteUser

我发现这样对于我在SQL管理应用程序和代码中的管理更容易。

像其他人说的那样,请勿以sp_为前缀。


1
这是一篇旧帖子,但我发现它有助于确认我是否正确命名了存储过程或使用了最佳实践。当存储过程仅在该应用程序中使用时,我开始使用应用程序名称(或缩写)作为前缀。在修改一个非常古老的应用程序期间,我将所有内联SQL转换为存储过程。创建了许多存储过程后,我发现这种命名约定使它们可以分组在一起,并且在以后重新创建它们并将它们移动到生产数据库之前更容易找到它们。 - Doreen
3
在我看来,_AppNameUser_GetUser 不是一个好的存储过程名称。存储过程应该是通用的、可被任何连接到数据库的应用程序重复使用的对象。如果您有多个应用程序连接到数据库怎么办?如果您的应用程序名称更改了怎么办?我见过许多以已经消失的应用程序命名的存储过程。数据库对象往往比大多数应用程序存在时间更长,因此请明智地命名它们。 - Yasir

6
不要使用"sp_"或者"usp_"前缀。我们知道它们是存储过程,命名规则不需要告诉我们这一点。
通常我会根据它们的功能来命名它们,并且可能按照模式进行分区。例外情况是我会在不直接用作“正常”数据库操作的存储过程中使用“ssis_”前缀,但是这些存储过程会被SSIS包用于引用数据库。我可能会使用“fn_”来表示函数,以区别于存储过程。

6

我不确定在这种情况下是否真的有一个特定的“最佳实践”。在我现在所在的公司中,标准是使用usp[ProcedureName](没有下划线)。我个人更喜欢根本没有前缀,但如果你是新来公司或项目,并且他们有预先存在的标准,除非他们正在使用sp_,而在这种情况下有技术上的原因不使用它,否则这可能不值得争论,因为我肯定认为这在任何情况下都不是一个过分的标准。

通常在重新命名约定方面,如果您进行辩论,其他团队成员不同意您并且共识标准不同,则最好的政策是快速放手并接受共识;一致性通常比实际标准本身更重要,以及与其他团队成员相处融洽,不会被认为是“难搞”的人。


我同意,对于团队来说,达成共识是最重要的事情。 - Galkin

2

在命名时在名称前加上“SP_”是非常多余的:这是为实现而命名的(它是一个存储过程,而不是一个表或视图)。有很多其他方法(系统表、information_schema、你如何使用它)可以告诉你它是如何实现的。

相反,你应该根据它的接口来命名它,根据它对你的作用来命名。为了方便(因为许多事情最终会按字母顺序排序),我喜欢将类似的事物分组在类似的名称下,可能使用相同的前缀。

但再次强调,要根据其 功能 而非 实现方式 进行命名。

总的来说,我发现数据库对象的通用命名约定使用下划线而不是驼峰式大小写;这只是一种惯例。不是惯例的是,也普遍使用所有小写字母来命名数据库对象;这使你可以忽略可能区分大小写的服务器设置。


1

我倾向于给函数命名,不仅能够表达其功能,还能说明输入变量的含义。

例如: ProcessMathEquationWithFieldIdPlantId

这样做可以立即为其他使用者提供信息,我认为这很有帮助。

此外,我避免使用sp_和usp_以限制任何名称冲突的可能性。


0

我不是专业人士,但我喜欢这种方式

应用程序前缀 = XY; 视图 = v; 存储过程 = p; 函数 = f

Table: XY_Name
View: vXY_Name
Procedure: sXY_Name
Function: fXY_Name

你觉得呢?我知道一些人使用两个字符来识别对象类型,但对于大多数情况一个字符就足够了,不是吗?


0

这可能会有所帮助。作为前端/后端程序员,我在MySQL和SQLServer中都使用以下内容:

SPx_PAGE/MODULE_ACTION_OBJECT 

x: R表示读取,I表示插入,U表示更新,W表示写入(如果索引不存在则结合插入,如果存在则结合更新),D表示删除。

页面/模块:调用该过程的位置

示例:

SPR_DASHBOARD_GET_USERS //reads users data
SPW_COMPANIES_PUT_COMPANY //creates or modifies a company

0
最好为每个模块创建模式。
然后给予有意义且简单的名称。
例如:如果你正在进行学校项目。
创建 Student 模式。
过程名称:AddStudent 这样在过程列表中看起来就像是 Student.AddStudent
对于教师模块也是同样的做法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接