【问题标题】:Automatically Drop Old Stored Procedure in SQL Server自动删除 SQL Server 中的旧存储过程
【发布时间】:2012-03-15 03:41:38
【问题描述】:

我正在以交互方式在 SQL Server 2008 中编写存储过程。使用 SQL Server Management Studio 时,每次进行更新时,我都必须手动刷新 Programmability 文件夹,然后右键单击,然后删除,然后确定。我也可以运行查询来删除存储过程。

在第一次执行代码(来自实际的存储过程代码,而不是 exec 命令)时,是否有一些函数可以放入存储过程中,它将检查是否存在现有的存储过程,如果有,那么 @987654322 @ 并替换为新代码?

或者,由于版本控制,这是一个坏主意吗?

【问题讨论】:

标签: sql-server stored-procedures


【解决方案1】:

您可以将其添加到过程脚本的顶部。 (只需将 ownerName 和 ProcName 替换为实际值即可。

IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[OwnerName].[ProcName]') AND type in (N'P', N'PC'))
DROP PROCEDURE [OwnerName].[ProcName]
GO

您也可以写ALTER PROC,但如果您将工作保存为脚本以便稍后部署到可能没有该过程的数据库中,这可能是个问题

顺便说一句,您始终可以通过右键单击现有过程并选择 Script Stored Procedure as -> DROP and CREATE to -> ... 让 SQL Server 为您生成此文件

您也可以使用模板资源管理器 Ctrl+Alt+T 并使用 Drop Stored Procedure 模板(以下是默认模板),然后使用 Query -> Specify Values for Template Parameters

-- =======================================================
-- Drop Stored Procedure 
-- =======================================================

-- Drop stored procedure if it already exists
IF EXISTS (
  SELECT * 
    FROM INFORMATION_SCHEMA.ROUTINES 
   WHERE SPECIFIC_SCHEMA = N'<Schema_Name, sysname, Schema_Name>'
     AND SPECIFIC_NAME = N'<Procedure_Name, sysname, Procedure_Name>' 
)
   DROP PROCEDURE <Schema_Name, sysname, Schema_Name>.<Procedure_Name, sysname, Procedure_Name>
GO

【讨论】:

    【解决方案2】:

    使用ALTER 而不是CREATE,这样您就可以修改现有的存储过程,而不必删除然后重新创建。

    【讨论】:

    • alter 还将维护您在 proc 上授予的任何特定权限。
    【解决方案3】:

    首先检查是否存在:

    if exists(select * from sys.procedures where object_id = OBJECT_ID('dbo.procname'))
      drop procedure dbo.procname
    

    但是这样做你会杀死已经授予或拒绝的权限,所以 - 不使用删除/创建场景的更好方法,但检查不存在和alter

    if NOT exists(select * from sys.procedures where object_id = OBJECT_ID('dbo.procname'))
      EXEC('CREATE PROC dbo.procname as')
    GO
    ALTER PROCEDURE dbo.procname
    ...
    

    【讨论】:

      【解决方案4】:

      在 SQL Server 2008 Management Studio 中,我右键单击存储过程 - 选择脚本存储过程为 - 选择删除并创建到 - 新查询窗口编辑器。

      我们已经在上面提到的所有程序中都有这个代码:

      IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[Name].[spName]') AND type in (N'P', N'PC'))
      DROP PROCEDURE [Name].[spName]
      GO
      

      所以我可以在查询窗口中对过程进行更改,从命令工具栏执行它以获取我的更改。然后我转到存储过程并右键单击以执行它。无需刷新或删除。

      【讨论】:

        【解决方案5】:

        当我创建我的存储过程脚本时,我经常在每个存储过程定义之前加上类似以下的内容(我见过变体):

        PRINT 'Creating stored procedure "sp_tbl_multipart_msg_part_move".'
        IF EXISTS (SELECT * FROM sysobjects WHERE id = object_id('sp_tbl_multipart_msg_part_add'))
            DROP PROCEDURE dbo.sp_tbl_multipart_msg_part_move
        GO
        CREATE PROCEDURE dbo.sp_tbl_multipart_msg_part_move
        --SP Code Goes Here
        END
        GO
        

        然后我可以每次都运行整个脚本,它会在重新创建它们之前删除 procs。

        我想这就是你的意思。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-09-15
          • 1970-01-01
          • 1970-01-01
          • 2019-08-10
          相关资源
          最近更新 更多