【问题标题】:How to create a duplicate copy of a SQL Server stored proc or view with a new name?如何使用新名称创建 SQL Server 存储过程或视图的副本?
【发布时间】:2011-08-23 16:39:47
【问题描述】:

假设我有一个存储过程 proc_MyTestProc。

我想为这个过程创建一个名为 proc_MyTestProc_{timestamp} 的备份副本,并在它的位置创建这个过程的一个新实例。这是我目前的方法:

  1. 在 proc_MyTestProc 上运行 sp_rename,附加时间戳。
  2. 为新版本的 proc_MyTestProc 运行新的 CREATE 脚本。

这种方法的问题在于它不适用于复制。原始过程保留相同的对象 ID。第 2 步中创建的过程是我想要复制到另一个数据库的过程,但它有一个新的对象 ID,所以它不会复制。

是否有替代 SP_RENAME 的方法来创建具有新对象 ID 的对象副本?

我正在运行 SQL Server 2005。

【问题讨论】:

  • 考虑改用source control
  • @Andomar +1 我正要提出同样的建议。我无法忍受看到 15 个旧的、过时的存储过程版本,名称后面附加了旧的时间戳。
  • @Andomar:我同意,因为乌龟是免费的。我的回答只是展示如何去做,而不是解决问题:)

标签: sql-server sql-server-2005 replication database-replication


【解决方案1】:
DECLARE @old VARCHAR(255),
        @new VARCHAR(255),
        @sql NVARCHAR(MAX),
        @myid UNIQUEIDENTIFIER

SET @myid = NEWID();


SELECT @old = 'invoice_validation_sp', @new = @old + CONVERT(VARCHAR(20),GETDATE(), 112)

SELECT @sql = REPLACE(OBJECT_DEFINITION(OBJECT_ID),@old, @new) 
FROM sys.procedures 
WHERE name = @old

EXECUTE sp_executesql @sql

你总是可以做这样的事情......

【讨论】:

  • 我看到的唯一问题是您正在执行子字符串搜索和替换。因此,如果它在 proc 代码中的某处包含字符串,它可能会破坏 proc。例如,假设 invoice_validation_sp 调用 invoice_validation_sp_helper。
  • 你是绝对正确的。您可以将搜索更改为“create proc [dbo].[invoice_validation_sp]”
猜你喜欢
  • 2013-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多