删除多个过程(SQL 2005)

时间:2010-02-02 08:42:53

标签: sql-server stored-procedures

我很好奇我是否可以通过简单地使用“%”来删除多个程序? 像:

DROP constantName%

当我在Management studio中使用DROP时,它看起来像是:

/****** Object:  StoredProcedure [dbo].[x]    Script Date: 02/02/2010 09:36:25 ******/
IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[x]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[x]

为什么在删除此特定对象时检查对象ID?

3 个答案:

答案 0 :(得分:1)

OBJECT_ID返回架构范围对象的数据库对象标识号。在你的代码中,它在IF EXISTS内部进行检查,因此只有在数据库中存在时才会删除存储过程。

您可以拥有DROP PROCEDURE proc_name,但如果该过程不存在,您最终可能会收到错误消息。在删除之前检查它是一种很好的做法。

表,视图,存储过程等都具有OBJECT_ID作为密钥标识符。

我不相信你可以使用LIKE删除多个存储过程。 (虽然我不是100%肯定的)

答案 1 :(得分:1)

我担心你不能在DROP中使用类似的语法,在简单的一行内容下面删除多个程序。

   DROP PROCEDURE testest,testest1 

对于你的第二个问题。我们可以创建只能由特定角色访问的Storedprocedure。

create proc dbo.testest
as
begin
    select 1
end

使用角色值

查询sys.objects
select * from sys.objects where name ='dbo.testest'

它返回null

   select * from sys.objects where name ='testest'

现在可行了

sys.objects目录视图存储没有角色名称的信息(仅名称)。但是使用OBJECT_ID,我们可以检索角色特定信息

   select OBJECT_ID('dbo.testest') //works
   select OBJECT_ID('testest') //works
希望你现在能理解。

答案 2 :(得分:1)

我认为SQL设计有这个限制,drop procedure命令需要一个字符串常量。您也不能将变量作为参数传递,它只会在您执行时产生“错误的语法”错误。

此外,OBJECT_ID函数仅返回用户拥有或拥有权限的对象的有效ID。因此使用OBJECT_ID是因为它执行安全性验证。

仅使用“WHERE name ='object_name'”进行删除也可以,但前提是用户具有该对象的权限。