为t-sql命名存储过程的最佳实践是什么?

时间:2009-05-16 03:24:29

标签: sql sql-server tsql stored-procedures

我曾与几个大型数据库合作,存储过程的名称非常不同:

SP_PrefixXXX
PrefixYyyXxx
Prefix: Rep, Act

命名的最佳做法是什么?我怎样才能以正确的方式组织它们?

11 个答案:

答案 0 :(得分:52)

sp_前缀代表系统过程,应该用作常规过程的前缀。如果这样做,它将首先每次额外访问master数据库以查找该过程,如果它与其中一个过程具有相同的名称,则将执行该过程而不是您的过程过程

除此之外,您可以自由地编写您喜欢的任何命名约定。我们公司使用的是subsystem_object_action,例如main_Customer_Get。这使得属于一起的程序在列表中彼此接近。

答案 1 :(得分:7)

最佳命名约定是整个数据库中的一致性:)

真的,这取决于你和你的团队。只要它清晰明了,你就有一点余地。只要确保无论你决定什么,每个人都坚持它。比公约本身更重要的是每个人都坚持下去。

我倾向于避免使用sp_,usp_等,因为我发现它们是多余的。例如,名为InsertCustomer的sproc显然是一个sproc,并且绝不会混淆表,视图或任何其他类型的对象。特别应该避免sp_。

我更喜欢CamelCase,但同样,这是一个偏好问题。我喜欢我的proc名称,以便很好地指示proc的作用 - 例如:

InsertSalesOrder PopulateItemStagingTables CalculateOrderSummary PrepareCustomerStatements

答案 2 :(得分:7)

我喜欢为它们添加前缀,因此SP处理特定对象的组合在一起。所以不是像:

    InsertUser
    UpdateUser
    DeleteUser
    GetUsers

我这样做:

    AppName_User_GetUser
    AppName_User_InsertUser
    AppName_User_UpdateUser
    AppName_User_DeleteUser

我发现在我的SQL管理应用程序和代码中也很容易管理。

与其他人说的一样,不要以 sp _

作为前缀

答案 3 :(得分:6)

不是“sp_”,也不是“usp_”。我们知道他们是存储过程,命名方案不需要告诉我们。

我通常只是为他们所做的事情命名,可能在模式上将它们分区。例外情况是我将对存储过程使用“ssis_”前缀,这些存储过程不直接用作“正常”数据库操作的一部分,但是SSIS包用它来引用数据库。我可以使用“fn_”来表示一个函数,以区别于存储过程。

答案 4 :(得分:6)

我不知道在这种情况下是否确实存在特定的“最佳实践”。对于我现在的公司,标准是usp [ProcedureName](没有下划线)。我个人不会喜欢任何前缀,但是如果你是一个新的公司或项目并且他们有预先存在的标准,除非他们使用sp_哪里有技术原因不使用它,它可能不是这个问题值得辩论,因为我当然不认为这是一个令人震惊的标准。

一般来说,重新命名惯例,如果你确实有辩论而其他团队成员不同意你并且共识标准不同,那么最好的政策就是尽快让它去接受共识;一致性通常比实际标准本身更重要,因为它与其他团队成员相处得很好而没有因“困难”而声名鹊起。

答案 5 :(得分:2)

好吧,在名称前添加“SP_”几乎是多余的:它为实现命名(它是一个SP,而不是一个表或一个视图)。还有很多其他的方法(systebales,information_schema,你如何使用它)会告诉你它已经实现了。

相反,你应该为它的界面命名,为它做什么。为了方便起见(因为很多事情最终按字母顺序排序),我喜欢用类似名称分组,可能使用相同的前缀。

但是,再次命名为它做什么,而不是它是如何实现的

通常,我发现数据库对象的常见命名约定使用下划线而不是CamelCase;这只是一个惯例问题。不仅仅是约定,也是对数据库对象使用全小写字母的通用惯例;这允许您忽略可能或可能不区分大小写的服务器设置。

答案 6 :(得分:1)

我倾向于尝试提供名称,不仅可以了解函数的用途,还有输入变量的含义。

例如: ProcessMathEquationWithFieldIdPlantId

我相信,这将有助于立即向使用它的任何人提供信息。

我也避免使用sp_和usp_来限制名称冲突的可能性。

答案 7 :(得分:0)

我不是专业人士,但我喜欢这样

申请前缀= XY; View = v;存储过程= p;功能= f

Table: XY_Name
View: vXY_Name
Procedure: sXY_Name
Function: fXY_Name
你怎么看?我知道有些人使用这两个字符来识别对象类型,但对于大多数情况,一个字符就够了,对吗?

答案 8 :(得分:0)

更好地为单独的模块创建模式。

然后给出有意义且简单的名字。

例如:如果你正在上学项目。

创建学生架构

程序名称: AddStudent

因此在程序清单

中看起来像 Student.AddStudent

教师模块的相同内容

答案 9 :(得分: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

答案 10 :(得分:0)

我们使用了这个约定:Prefix_Factory_Action

前缀

  • up:User Procedure 的缩写,用于命名空间
  • ap:Administrator Procedure 的缩写,仅供数据库管理员使用
  • sp:系统过程的缩写。只应由 Microsoft 使用,因为首先检查 master
  • xp:eXternal Procedure 的缩写。被微软和其他开发者使用

工厂

在我们的命名空间或任何其他逻辑结构中使用的名称。它不是一张桌子,尽管它通常与一张桌子同名。示例包括论文、教职员工和学生

行动

正在执行的操作类型,例如获取、设置、插入、更新、删除、保存、填充、重新填充等

Action 有时后跟限定词,例如 For/By/In

示例

  • ap_Paper_Repopulate
  • up_Staff_Save
  • up_Enrolment_GetForStudent