Sql server 添加后缀“_删除“;所有被标识为未使用的存储过程

Sql server 添加后缀“_删除“;所有被标识为未使用的存储过程,sql-server,Sql Server,在试图清理我的数据库时,我设法识别了一个未被使用的存储过程列表。我想将这些标记为删除,在一个脚本中为所有这些添加后期修复“\u DELETE”。有谁能告诉我怎么做吗?谢谢。请尝试使用光标: DECLARE @mockupTable TABLE(ID INT IDENTITY, SPName VARCHAR(100)); INSERT INTO @mockupTable VALUES ('old_proc_name1') ,('old_proc_name2') ,('old_proc_name3

在试图清理我的数据库时,我设法识别了一个未被使用的存储过程列表。我想将这些标记为删除,在一个脚本中为所有这些添加后期修复“\u DELETE”。有谁能告诉我怎么做吗?谢谢。

请尝试使用光标:

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 

为此,请尝试使用游标:

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 

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

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;
值得注意的是,这是我提倡使用游标的极少数情况之一,但如上所述,在使用游标时,应始终确保明确声明尽可能最简单的游标(例如,
本地静态只读转发
)。通过告诉SQL Server您的游标将是静态的,只在本地使用,并且只在一个方向上读取,您的游标将比不读取时快得多,SQL Server必须假设游标可能发生任何事情。在这样的小规模上,它不太可能产生明显的影响,但在更大的规模上,它可以产生相当大的影响

进一步阅读请参见-结论实际上是我应该使用
本地快进
,而不是我使用的选项。不过,我把它们留在了这里,因为差别可以忽略不计,而且我发现使用所有4个都更容易记住,显示也更清晰


要重新迭代注释中所述的内容,最好在数据库上使用版本控制,这样您就不需要将任何内容标记为删除,只需删除它,并在源代码控制中保留定义。如果出于任何原因无法使用源代码管理,

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

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;
值得注意的是,这是我提倡使用游标的极少数情况之一,但如上所述,在使用游标时,应始终确保明确声明尽可能最简单的游标(例如,
本地静态只读转发
)。通过告诉SQL Server您的游标将是静态的,只在本地使用,并且只在一个方向上读取,您的游标将比不读取时快得多,SQL Server必须假设游标可能发生任何事情。在这样的小规模上,它不太可能产生明显的影响,但在更大的规模上,它可以产生相当大的影响

进一步阅读请参见-结论实际上是我应该使用
本地快进
,而不是我使用的选项。不过,我把它们留在了这里,因为差别可以忽略不计,而且我发现使用所有4个都更容易记住,显示也更清晰


要重新迭代注释中所述的内容,最好在数据库上使用版本控制,这样您就不需要将任何内容标记为删除,只需删除它,并在源代码控制中保留定义。如果出于任何原因无法使用源代码管理,

EXEC sp_重命名“old_proc_name”,“old_proc_name_DELETED”
?检查此线程:这些存储过程是否不受源代码管理?如果不是,认真地问问自己为什么他们不是。如果是,为什么不直接删除它们?另外,如果现有名称的长度>长度-7,您想做什么?
EXEC sp_重命名“old_proc_name”、“old_proc_name_DELETED”
?检查此线程:这些存储过程是否不受源代码控制?如果不是,认真地问问自己为什么他们不是。如果是,为什么不直接删除它们?另外,如果现有名称的长度>长度-7,您想做什么?