簡體   English   中英

SQLServer復制存儲過程

[英]SQLServer copy stored procedure

我想要一種方法將我的存儲過程的副本存儲到存儲過程中,其名稱類似於sp_oldprocedureName_yyyymmddhhmiss,編程方式,如:
(以下代碼是我的“內涵”代碼)

declare @DateExtension char(14)  
select @DateExtension = substring(CONVERT(varchar(30), getdate(), 120), 1,4) + substring(CONVERT(varchar(30), getdate(), 120), 6, 2)+ substring(CONVERT(varchar(30), getdate(), 120), 9, 2)+ substring(CONVERT(varchar(30), getdate(), 120), 12, 2)+ substring(CONVERT(varchar(30), getdate(), 120), 15, 2)+ substring(CONVERT(varchar(30), getdate(), 120), 18, 2)  

declare @OldName, @NewName varchar(255)  
set @OldName = 'sp_OldProcedureName'  
set @NewName = @OldName + '_' + @DateExtension  
sp_copy(@OldName, @NewName)  --This sp_copy does not exist, but I'm looking for an equivalent.

那么,是否有像上面的“sp_copy”這樣的程序?

好的 - 嘗試以下方法。 該過程應該按照您的指定工作。 它將從sql_modules獲取procs定義並使用新名稱執行它。 可能需要一些調試。

CREATE PROCEDURE spCopy @OLDNAME NVARCHAR(255), @NEWNAME NVARCHAR(255)
AS
BEGIN
DECLARE @SQL NVARCHAR(MAX)

    SELECT @SQL = REPLACE(definition,@OLDNAME,@NEWNAME) 
    FROM sys.sql_modules 
    WHERE object_ID(@OLDNAME) = object_id

    EXEC @SQL
END 

您可以創建以下存儲過程:

CREATE PROCEDURE sp_copy
    (@OldName VARCHAR(255),
    @NewName VARCHAR(255))
    AS BEGIN

BEGIN TRY
DECLARE @definition NVARCHAR(MAX), @sql NVARCHAR(MAX);
SELECT @definition = m.definition
   FROM sys.procedures p
   JOIN sys.sql_modules m ON p.OBJECT_ID = m.OBJECT_ID
   WHERE name LIKE @OldName;
IF @definition IS NULL
BEGIN
    PRINT 'There is no stored procedure with name: ''' + @OldName + '''';
END;
ELSE
BEGIN
    SET @definition = REPLACE(@definition, @OldName,@NewName);
    SET @definition = REPLACE(@definition, '''','''''');
    SET @sql = 'EXEC(''' + @definition + ''')';
    EXEC(@sql);
    PRINT 'Stored procedure duplicated successfully.';
END;
END TRY
BEGIN CATCH
    PRINT 'There was an issue copying the stored procedure.';
END CATCH;

END;
GO

然后像這樣執行代碼:

DECLARE @OldName VARCHAR(255)  , @NewName VARCHAR(255);  
DECLARE @DateExtension CHAR(14);  
SELECT @DateExtension = SUBSTRING(CONVERT(VARCHAR(30), GETDATE(), 120), 1,4) + SUBSTRING(CONVERT(VARCHAR(30), GETDATE(), 120), 6, 2)+ SUBSTRING(CONVERT(VARCHAR(30), GETDATE(), 120), 9, 2)+ SUBSTRING(CONVERT(VARCHAR(30), GETDATE(), 120), 12, 2)+ SUBSTRING(CONVERT(VARCHAR(30), GETDATE(), 120), 15, 2)+ SUBSTRING(CONVERT(VARCHAR(30), GETDATE(), 120), 18, 2);  
SET @OldName = 'sp_OldProcedureName';  
SET @NewName = @OldName + '_' + @DateExtension;  
EXEC dbo.sp_copy @OldName, @NewName;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM