DECLARE @obj TABLE ( id int identity, objname sysname, objtype sysname )
DECLARE @i int
, @sql nvarchar(max)INSERT INTO @obj ( objname, objtype )
SELECT A.name
, (case when A.type = 'V' then 'VIEW'
when A.type in ('FN','IF','TF') then 'FUNCTION'
when A.type = 'P' then 'PROCEDURE'
else '' end )
FROM sysobjects A (NOLOCK)
WHERE A.type IN ( 'V', 'FN', 'IF', 'TF', 'P' )
ORDER BY (case A.type when 'V' then 3
when 'P' then 1
else 2 end )
, A.name DESCSELECT @i = max(id) FROM @obj
WHILE @i > 0
BEGIN
SELECT @sql = 'DROP ' + A.objtype + ' ' + A.objname
FROM @obj A
WHERE A.id = @i
PRINT @sql
SET @i = @i - 1
END
This is one example where using a table variable and while loop on a relatively small set of data is preferred, simply because the "sysobjects" table will be mutating through the process of the loop. Could still get away with it in a cursor if locks and hints are properly applied, but I still prefer to avoid it when possible.