在sql中创建存储过程的最佳实践

在sql中创建存储过程的最佳实践,sql,tsql,stored-procedures,sql-server-2012,Sql,Tsql,Stored Procedures,Sql Server 2012,我曾经遇到过这个问题,创建一个过程,然后当我想要修改它时,我通常先删除它,然后再重新创建它。然后我觉得那要花很多时间。 我必须找到更好的办法 这是最好的方式,以缓解时间。还有,万一你以后需要修改它???有趣的是,我发现你可以用一个过程来完成所有这些。将过程分为两部分: 如果指定模式中不存在具有指定名称的存储过程,则第一部分将创建一个空/伪存储过程/存根。在新环境中创建此存储过程时,这对于初始设置非常有用 上述脚本的第二部分始终更改存储过程—无论它是在第一步中创建的还是以前存在的。因此,每次需要

我曾经遇到过这个问题,创建一个过程,然后当我想要修改它时,我通常先删除它,然后再重新创建它。然后我觉得那要花很多时间。 我必须找到更好的办法


这是最好的方式,以缓解时间。还有,万一你以后需要修改它???

有趣的是,我发现你可以用一个过程来完成所有这些。将过程分为两部分:

  • 如果指定模式中不存在具有指定名称的存储过程,则第一部分将创建一个空/伪存储过程/存根。在新环境中创建此存储过程时,这对于初始设置非常有用

  • 上述脚本的第二部分始终更改存储过程—无论它是在第一步中创建的还是以前存在的。因此,每次需要对存储过程进行一些更改时,只需更改上述脚本的
    alterprocedure
    部分(第二部分),就可以执行整个脚本,而不必担心存储过程是否已经存在

示例代码:

USE AdventureWorks 
GO 
IF OBJECT_ID('dbo.uspGetEmployeeDetails') IS NULL -- Check if SP Exists
    EXEC('CREATE PROCEDURE dbo.uspGetEmployeeDetails AS SET NOCOUNT ON;') -- Create dummy/empty SP 

GO 
ALTER PROCEDURE dbo.uspGetEmployeeDetails -- Alter the SP Always 
    @EmployeeID INT 
AS 
BEGIN 
    SET NOCOUNT ON; 

    SELECT  HRE.EmployeeID , 
            PC.FirstName + ' ' + PC.LastName AS EmployeeName , 
            HRE.Title AS EmployeeTitle , 
            PC.EmailAddress AS EmployeeEmail , 
            PC.Phone AS EmployeePhone 
    FROM    HumanResources.Employee AS HRE 
            LEFT JOIN Person.Contact AS PC 
                ON HRE.ContactID = PC.ContactID 
    WHERE HRE.EmployeeID = @EmployeeID 

END 
GO
希望它能帮助别人,谢谢


这里有一个链接提供更多信息:

很有趣,我发现您可以使用一个过程完成所有这些操作。将过程分为两部分:

  • 如果指定模式中不存在具有指定名称的存储过程,则第一部分将创建一个空/伪存储过程/存根。在新环境中创建此存储过程时,这对于初始设置非常有用

  • 上述脚本的第二部分始终更改存储过程—无论它是在第一步中创建的还是以前存在的。因此,每次需要对存储过程进行一些更改时,只需更改上述脚本的
    alterprocedure
    部分(第二部分),就可以执行整个脚本,而不必担心存储过程是否已经存在

示例代码:

USE AdventureWorks 
GO 
IF OBJECT_ID('dbo.uspGetEmployeeDetails') IS NULL -- Check if SP Exists
    EXEC('CREATE PROCEDURE dbo.uspGetEmployeeDetails AS SET NOCOUNT ON;') -- Create dummy/empty SP 

GO 
ALTER PROCEDURE dbo.uspGetEmployeeDetails -- Alter the SP Always 
    @EmployeeID INT 
AS 
BEGIN 
    SET NOCOUNT ON; 

    SELECT  HRE.EmployeeID , 
            PC.FirstName + ' ' + PC.LastName AS EmployeeName , 
            HRE.Title AS EmployeeTitle , 
            PC.EmailAddress AS EmployeeEmail , 
            PC.Phone AS EmployeePhone 
    FROM    HumanResources.Employee AS HRE 
            LEFT JOIN Person.Contact AS PC 
                ON HRE.ContactID = PC.ContactID 
    WHERE HRE.EmployeeID = @EmployeeID 

END 
GO
希望它能帮助别人,谢谢


这里有一个链接可获取更多信息:

这是一种很好的做事方式。通常你会看到有人删除这个进程(如果它存在的话),然后重新创建它,这会起作用,但是你会失去对这个对象的权限。这是一个很好的方法。通常情况下,您会看到有人删除该进程(如果它存在),然后重新创建该进程,但您将失去对该对象的权限。