Sql 一次删除所有存储过程
我的Sql 一次删除所有存储过程,sql,stored-procedures,sql-server-2008-r2,Sql,Stored Procedures,Sql Server 2008 R2,我的Sql server 2008 R2数据库中有200个存储过程,它们是由应用程序自动生成的。现在我想删除它们全部并重新生成它们,因为表发生了很大变化 但在我的例子中,所有SP都以SP_开头,我认为使用相同的代码是危险的,因为系统SP也以SP_开头,我可能会将它们全部杀死 我应该相信解决方案吗?如果没有更安全的解决方案?如果这是一次性任务,只需打开对象资源管理器,展开数据库>可编程性并突出显示存储过程节点。然后打开对象资源管理器详细信息(我想是F7)。在右边,你应该看到你的列表,在这里你可以多
Sql server 2008 R2
数据库中有200个存储过程,它们是由应用程序自动生成的。现在我想删除它们全部并重新生成它们,因为表发生了很大变化
但在我的例子中,所有SP都以SP_开头,我认为使用相同的代码是危险的,因为系统SP也以SP_开头,我可能会将它们全部杀死
我应该相信解决方案吗?如果没有更安全的解决方案?如果这是一次性任务,只需打开对象资源管理器,展开数据库>可编程性并突出显示存储过程节点。然后打开对象资源管理器详细信息(我想是F7)。在右边,你应该看到你的列表,在这里你可以多选-这样你就可以按名称排序,选择所有以sp_开头的过程,然后一键删除它们
如果重复执行此操作,则(假设您的过程都在dbo模式中):
我发现了这一点,然后进行了测试,StoredProcedure
是在存储过程文件夹外部创建的
但是自动生成扩展名的sp_
是.sys
,如果正确,则创建的sp_
是.dbo
。因此,提示是获取所有的.dbo
扩展名并将其删除:)能够使用单个SELECT
plusEXEC
而不必声明游标
并进行迭代,这真的很好。我不知道T-SQL允许您以这种方式构建字符串(SELECT@SQL+=
),非常聪明。我们正在寻找这样的解决方案。我确实对查询做了一些调整。声明\@sql NVARCHAR(MAX)=N';选择\@sql+=N'DROP PROCEDURE['+SCHEMA_NAME(p.[SCHEMA_id])+'.+QUOTENAME(p.[NAME])+';'来自sys.procedures p,其中p.is_ms_shipped=0——以及(N'dbo')EXEC sp_executesql\@sql中的SCHEMA_NAME(p.[SCHEMA_id]);查询不再硬编码到dbo模式。我还添加了一个过滤器,以避免删除系统存储过程。还有一个标准要根据模式进行限制,尽管我的案例中不需要它。
DECLARE @sql NVARCHAR(MAX) = N'';
SELECT @sql += N'DROP PROCEDURE dbo.'
+ QUOTENAME(name) + ';
' FROM sys.procedures
WHERE name LIKE N'sp[_]%'
AND SCHEMA_NAME(schema_id) = N'dbo';
EXEC sp_executesql @sql;
CREATE PROC UserStoredProcedure_Sample1
AS
SELECT 'SQL Server rocks'
GO
CREATE PROC UserStoredProcedure_Sample2
AS
SELECT 'SQL Server rocks'
GO
SET NOCOUNT ON
-- to do this we have to use EXEC instead of sp_executesql
-- sp_executesql does not accept a DROP command in the SQL String
DECLARE @UserStoredProcedure VARCHAR(100)
DECLARE @Command VARCHAR(100)
DECLARE UserStoredProcedureCursor CURSOR SCROLL STATIC READ_ONLY FOR
SELECT
SPECIFIC_NAME
FROM
INFORMATION_SCHEMA.ROUTINES
OPEN UserStoredProcedureCursor
FETCH NEXT FROM UserStoredProcedureCursor
INTO @UserStoredProcedure
WHILE (@@FETCH_STATUS = 0) BEGIN
SET @Command = 'DROP PROCEDURE ' + @UserStoredProcedure
-- display; visual check
SELECT @Command
-- when you are ready to execute, uncomment below
EXEC (@Command)
FETCH NEXT FROM UserStoredProcedureCursor
INTO @UserStoredProcedure
END
CLOSE UserStoredProcedureCursor
DEALLOCATE UserStoredProcedureCursor
SET NOCOUNT OFF
DECLARE @DeleteProcCommand NVARCHAR(500)
DECLARE Syntax_Cursor CURSOR
FOR
SELECT 'DROP PROCEDURE ' + p.NAME
FROM sys.procedures p
OPEN Syntax_Cursor
FETCH NEXT FROM Syntax_Cursor
INTO @DeleteProcCommand
WHILE (@@FETCH_STATUS = 0)
BEGIN
EXEC (@DeleteProcCommand)
FETCH NEXT FROM Syntax_Cursor
INTO @DeleteProcCommand
END
CLOSE Syntax_Cursor
DEALLOCATE Syntax_Cursor
DECLARE @sql VARCHAR(MAX)='';
SELECT @sql=@sql+'drop procedure ['+name +'];' FROM sys.objects
WHERE type = 'p' AND is_ms_shipped = 0
exec(@sql);
-- drop all user defined stored procedures
Declare @procName varchar(500)
Declare cur Cursor For Select [name] From sys.objects where type = 'p'
Open cur
Fetch Next From cur Into @procName
While @@fetch_status = 0
Begin
Exec('drop procedure ' + @procName)
Fetch Next From cur Into @procName
End
Close cur
Deallocate cur