Generate all user stored procedures in all dbs

,

This generates all user stored procedures in all databases to aid in QA loads and DR situations. No OLE or DMO. has one configureable variable @path for storing the scripts. Also generates an osql script to run for each database.

--------------------------------------------------------------------------------------------------------
--Generate all user stored procedures
--Author Wesley D. Brown
--Date 5.24.2004
--Loops through a list of all user stored procedures in all databases
--ignores dt_ procs added by VS.NET feel free to comment out
--If not owned by DBO issues a sp_changeobjectowner assuming dbo as the owner this is assumed needed
--due to you the DBA being dbo of the database and not logged in as the user that the proc needs
--to be owned by feel free to comment it out.
--------------------------------------------------------------------------------------------------------
set nocount on
DECLARE @procname varchar(60)
declare @sproc varchar(255)
declare @cnt int
declare @user varchar(255)
DECLARE @bcp AS VARCHAR(8000)
DECLARE @Status AS INT
declare @dbname varchar(255)
declare @server_name varchar(255)
declare @cmd varchar(8000)
declare @owner varchar(255)
declare @path varchar(500)

set @server_name = cast(serverproperty('servername') as varchar(255))
--server name won't work on MSDE version of sql replace with @@SERVERNAME
set @path = '\\<servername>\spmigration\'
--path to save to UNC works just fine
select @user = loginame from master.dbo.sysprocesses where spid = @@SPID
--pulls the login name of the current user to fill out some of the self documentation

DECLARE dbperm CURSOR
READ_ONLY
FOR select name from master.dbo.sysdatabases order by name

OPEN dbperm

FETCH NEXT FROM dbperm INTO @dbname
WHILE (@@fetch_status <> -1)
BEGIN
	IF (@@fetch_status <> -2)
	BEGIN

		create table #sp_names
		(
		sp_name varchar(255)
		)
		insert into #sp_names
		exec('select '''+@dbname+'''+''.''+a.name+''.''+b.name from '+@dbname+'.dbo.sysobjects b
		inner join
		'+@dbname+'.dbo.sysusers a
		on
		b.uid = a.uid
		where xtype = ''P'' and category <> 2 and b.name not like ''r_iR%'' order by '''+@dbname+'''+''.''+a.name+''.''+b.name')

		DECLARE innerproc CURSOR
		READ_ONLY
		FOR 
		select 
			sp_name
		from
			#sp_names
		ORDER BY
			sp_name
		
		OPEN innerproc
		
		create table ##osql_holding
		(
			sid int IDENTITY(1,1),
			text varchar(255)
		)
		insert into ##osql_holding (text)
		values('declare @cmd varchar(8000)')
	
		FETCH NEXT FROM innerproc INTO @procname
		WHILE (@@fetch_status <> -1)
		BEGIN
			IF (@@fetch_status <> -2)
			BEGIN
			set @cnt = 1
		
			create table ##sp_holding
			(
			sid int IDENTITY(1,1),
			text varchar(255)
			)
		
			insert into ##sp_holding (text)
			VALUES('-- Server Name: ' + @server_name)
			insert into ##sp_holding (text)
			VALUES('-- Database Name: ' + @dbname)
			insert into ##sp_holding (text)
			VALUES('-- Procedure Name: ' + @procname)
			insert into ##sp_holding (text)
			VALUES('-- Date: ' + CONVERT(VARCHAR, GETDATE()))
			insert into ##sp_holding (text)
			VALUES('-- Stored prodecure generated automatically by user ' + @user)
			insert into ##sp_holding (text)
			VALUES('GO  ')
			set @cmd = @dbname+'.dbo.sp_helptext '+''''+@procname+''''
			insert into ##sp_holding (text)
			exec (@cmd)
			insert into ##sp_holding (text)
			VALUES('GO  ')
			if @procname not like '%.dbo%'
			begin
				select @owner = right(substring(@procname,charindex('.',@procname,0),charindex('.',@procname,(charindex('.',@procname)))),len(substring(@procname,charindex('.',@procname,0),charindex('.',@procname,(charindex('.',@procname)))))-1)
				select @procname = replace(@procname,(substring(@procname,charindex('.',@procname,0),charindex('.',@procname,(charindex('.',@procname))))),'.dbo')
				insert into ##sp_holding (text)
				VALUES('EXEC sp_changeobjectowner '''+@procname+''', '''+@owner+'''')
			end

			delete from ##sp_holding where sid not in(SELECT sid FROM ##sp_holding where len(ltrim(rtrim(replace(replace(text,char(13),''),char(10),'')))) > 0)
		
			update ##sp_holding
			set text = ltrim(rtrim(replace(replace(text,char(13),''),char(10),'')))
		
				PRINT ''
				PRINT 'Generating SQL'
				
				SELECT @bcp = 'bcp "SELECT rtrim(text) FROM ' + @dbname + '.dbo.##sp_holding" QUERYOUT "'+@path+'StoredProcs_' + @server_name +'_'+ @procname+ '.sql" -T -c'
				EXEC @Status = master.dbo.xp_cmdshell @bcp, no_output
		
				IF @Status <> 0
				BEGIN
					PRINT 'An error ocurred while generating the SQL file.'
				END 
				ELSE 
				begin
					set @bcp = 'set @cmd = ''osql -S '+@server_name+' -E -d '+@dbname+' -i "'+@path+'StoredProcs_' + @server_name +'_'+ @procname+  '.sql"'''
					PRINT ''+@path+'StoredProcs_' + @server_name +'_'+ @procname+  '.sql file generated succesfully.'
					insert into ##osql_holding values(@bcp)
					insert into ##osql_holding values('exec master..xp_cmdshell @cmd')
				end
		
			drop table ##sp_holding
			END
			FETCH NEXT FROM innerproc INTO @procname
		END
		CLOSE innerproc
		DEALLOCATE innerproc
		if (select count(*) from ##osql_holding) > 1
		begin
			SELECT @bcp = 'bcp "SELECT rtrim(text) FROM ' + @dbname + '.dbo.##osql_holding" QUERYOUT "'+@path+'Restore_StoredProcs_'+ @server_name+'_'+ @dbname+'.sql" -T -c'
			EXEC @Status = master.dbo.xp_cmdshell @bcp, no_output
					IF @Status <> 0
					BEGIN
						PRINT 'An error ocurred while generating the SQL file.'
					END 
					ELSE 
					begin
						PRINT ''+@path+'Restore_StoredProcs_' + @server_name+'_'+ @dbname+'.sql file generated succesfully.'
					end
		end
		drop table ##osql_holding
		drop table #sp_names
	END
	FETCH NEXT FROM dbperm INTO @dbname
END
CLOSE dbperm
DEALLOCATE dbperm

set nocount off

Rate

Share

Share

Rate