将后缀“ _DELETE”添加到所有标识为未使用的存储过程中

时间:2019-02-21 11:15:15

标签: sql-server

在尝试清理数据库时,我设法标识了一个未使用的存储过程列表。我想将这些标记为删除,然后在一个脚本中将后缀“ _DELETE”添加到所有这些标记中。谁能建议我该怎么做?谢谢。

2 个答案:

答案 0 :(得分:1)

尝试为此使用光标:

DECLARE @mockupTable TABLE(ID INT IDENTITY, SPName VARCHAR(100));
INSERT INTO @mockupTable VALUES
 ('old_proc_name1')
,('old_proc_name2')
,('old_proc_name3')

DECLARE @name VARCHAR(50) = 'deleted'
DECLARE @newName VARCHAR(50)


DECLARE db_cursor CURSOR FOR 
SELECT SPName FROM @mockupTable

OPEN db_cursor  
FETCH NEXT FROM db_cursor INTO @name  

WHILE @@FETCH_STATUS = 0  
BEGIN  
      SET @newName = CONCAT(@name, '_DELETED')
      --PRINT @newname
      EXEC sp_rename @name, @newname
      FETCH NEXT FROM db_cursor INTO @name 
END 

CLOSE db_cursor  
DEALLOCATE db_cursor 

答案 1 :(得分:1)

假设您已经有了过程的名称,您可以将它们替换为下面的光标定义:

DECLARE ProcCursor CURSOR LOCAL STATIC READ_ONLY FORWARD_ONLY
FOR
    SELECT  Name = CONCAT(QUOTENAME(s.name), '.', QUOTENAME(p.name)),
            [NewName] = CONCAT(p.name, '_DELETE')
    FROM    sys.procedures AS p
            INNER JOIN sys.schemas AS s
                ON s.schema_id = p.schema_id
    WHERE   p.object_id IN 
            (   OBJECT_ID('dbo.SomeProc', 'P'),
                OBJECT_ID('dbo.SomeProc2', 'P'),
                OBJECT_ID('dbo.SomeProc3', 'P')
            );

DECLARE @Name NVARCHAR(776), @NewName SYSNAME;
OPEN ProcCursor;

FETCH NEXT FROM ProcCursor INTO @Name, @NewName
WHILE (@@FETCH_STATUS = 0)
BEGIN
    EXECUTE sp_rename @Name, @NewName, 'OBJECT';
    FETCH NEXT FROM ProcCursor INTO @Name, @NewName
END

CLOSE ProcCursor;
DEALLOCATE ProcCursor;

值得注意的是,这是我提倡使用游标的极少数情况之一,但是如上所述,在使用游标时,应始终确保您明确声明可能的最简单游标(例如LOCAL STATIC READ_ONLY FORWARD_ONLY) 。通过告诉SQL Server,游标将是静态的,仅在本地使用,并且只能读取,并且仅在一个方向上运行,因此游标将比不使用游标时要快得多,并且SQL Server必须假设任何事情都会发生,光标。在这样的小规模规模上,不可能产生明显的变化,但在较大规模的领域,则可以产生显着的变化。

有关更多信息,请参见What impact can different cursor options have?-结论实际上是我应该使用LOCAL FAST_FORWARD,而不是我确实使用的选项。我将这些留在了这里,因为两者之间的差异可以忽略不计,我发现使用这四种方法更容易记住并且显示意图更清晰。

要再次重申注释中提到的内容,在数据库上使用版本控制确实是一个好主意,这样您就无需标记任何要删除的内容,您只需删除它,然后仍然保留源代码管理中的定义。如果由于某种原因无法使用源代码管理,请DDL triggers can provide rudimentary change tracking