views:

35

answers:

3

Hi, I am curious whether I can drop multiple procedures by simple using "%"? Like:

DROP constantName%

When I use DROP in the Management studio, it looks like that:

/****** 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]

Why it is checking the object ID when I am dropping this particular object? Thanks

+1  A: 

The OBJECT_ID returns the database object identification number of a schema-scoped object. In your code it is checking it inside an IF EXISTS, so that it will only DROP the stored proc if is present in the database.

You could just have DROP PROCEDURE proc_name, but you could end up getting an error if the procedure does not exist. Its just good practise to check before you remove.

Tables, View, Stored Procs etc all have an OBJECT_ID as a key identifier.

I do not believe you can drop mutiple stored procedures using a LIKE. (Though i;m not 100% certain on that)

kevchadders
+1  A: 

I am afraid you cant use the like syntax in DROP, below the simple one liner to drop multiple procedures.

   DROP PROCEDURE testest,testest1 

And for your 2nd question. There are scenarious we can create Storedprocedure that can be accessible only to the particular role.

create proc dbo.testest
as
begin
    select 1
end

query sys.objects with the role value

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

it returns null

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

now it works

sys.objects catalog view stores the information without the role names (only just names). But using OBJECT_ID, we can retrieve the role specific info

   select OBJECT_ID('dbo.testest') //works
   select OBJECT_ID('testest') //works

hope you can understand now.

Cheers

RameshVel

Ramesh Vel
I think OP wants to know how to delete more than one stored procedure in one query. Read the question.
Wez
@keyboardmonkey, "Why it is checking the object ID when I am dropping this particular object?" he specifically asked....
Ramesh Vel
and this is the only way to drop mutliplr procs.. DROP PROCEDURE testest,testest1 this will do the trick.
Ramesh Vel
You're both right. OP asked two questions <g>
Lieven
@Lieven, added some clarity..
Ramesh Vel
So he is :) I see what your answer is saying now.
Wez
+1  A: 

I think SQL was designed with this limitation, the drop procedure command needs a string constant. You can't pass a variable as an argument either, it just gives a 'incorrect syntax' error when you do.

Also the OBJECT_ID function only returns a valid id of objects the user owns, or has permission to. So OBJECT_ID is used because it performs the security validation.

Deleting with just "WHERE name = 'object_name'" could also work, but only if the user has permission for that object.

Wez