Sql server 添加后缀“_删除“;所有被标识为未使用的存储过程
在试图清理我的数据库时,我设法识别了一个未被使用的存储过程列表。我想将这些标记为删除,在一个脚本中为所有这些添加后期修复“\u DELETE”。有谁能告诉我怎么做吗?谢谢。请尝试使用光标: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
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,您想做什么?