将mater库中的系统存储过程批量生成*.sql文件--通用且非常实用

最近因为系统需要,需要将master库的所有和业务相关的存储过程批量生成【存储过程名.sql】文件

大家都知道系统存储过程是无法用工具导出的(大家可以试试 >任务>生成SQL脚本)

因为系统存储过程一般是不让开发人员修改的。

需要知识:

1、xp_cmdshell命令的使用

2、sp_MS_marksystemobject 标记系统存储过程的方法

3、dos 命令,如 type,>> 等

4、bcp 命令的使用

 

use master
go
if OBJECT_ID('pr_procToSql') is not null drop proc pr_procToSql
go
create proc pr_procToSql
(
@服务器名 varchar(100)
,@用户名 varchar(100)
,@密码 varchar(100)
,@path varchar(200)
,@database varchar(200)
,@sysproc int='0' --是否标记为系统函数 1:是,0:否
,@proc_name varchar(100)=''  --默认是所有,可以模糊搜索
,@savetype varchar(200)='.sql' --默认保存为sql脚本
)
as

/*
版本:v1
作者:达摩
日期:2012-04-13
功能:
1\将master库的系统存储过程批量生成文件(系统存储过程无法自动导出)
2\可以将所有类型的存储过程导出
3\可以标记上系统存储过程

调用:
exec pr_procToSql '.','sa','H4ymH@$RTd','e:\tom\master\','master','1',‘’
exec pr_procToSql '.','sa','a123456','e:\sql\','agt_trad','','pr_','.sql'
*/

set nocount on
declare @sp nvarchar(500),@s nvarchar(2000),@row int,@id int,@s_add varchar(2000)
set @s=' use '+@database
exec(@s)


if object_id('tempdb..#t') is not null drop table tempdb..#t

create table tempdb..#t(name varchar(2000)
, id int IDENTITY(1,1)  not null
)

exec('
insert into tempdb..#t(name)
select name
--into TEMPDB..#T 
from '+@database+'..sysobjects where xtype=''p'' and name like '''+@proc_name+'%''
')

select @row=COUNT(*) from tempdb..#t
print '共生成['+cast(@row as varchar)+']个存储过程'
set @id=1
while @row>=@id
begin
select top 1 @sp=name from tempdb..#T where id=@id
if OBJECT_ID('tempdb..test') is not null drop table tempdb..test

--增加use master go
set @s_add='echo use ['+@database+']>>'+@path+@sp+@savetype
exec xp_cmdshell @s_add
set @s_add='echo GO>>'+@path+@sp+@savetype
exec xp_cmdshell @s_add


set @s_add='echo IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N''[dbo].['+@sp+']'') AND type in (N''P'', N''PC''))>>'+@path+@sp+@savetype
exec xp_cmdshell @s_add

set @s_add='echo DROP PROCEDURE [dbo].['+@sp+']>>'+@path+@sp+@savetype
exec xp_cmdshell @s_add
set @s_add='echo GO>>'+@path+@sp+@savetype
exec xp_cmdshell @s_add

set @s_add='echo SET ANSI_NULLS ON>>'+@path+@sp+@savetype
exec xp_cmdshell @s_add

set @s_add='echo GO>>'+@path+@sp+@savetype
exec xp_cmdshell @s_add

set @s_add='echo SET QUOTED_IDENTIFIER ON>>'+@path+@sp+@savetype
exec xp_cmdshell @s_add

set @s_add='echo GO>>'+@path+@sp+@savetype
exec xp_cmdshell @s_add

 
select @s='
select text into tempdb..test 
from '+@database+'..syscomments 
where id=OBJECT_ID('''+@database+'..'+@sp+''')
'
exec(@s)

--select * from tempdb..test 
select @s='exec xp_cmdshell  '+'''bcp tempdb..test out '+@path+@sp+cast(@id as varchar)+@savetype+' -c -S '+@服务器名+' -U '+@用户名+' -P '+@密码+''''
exec(@s)

--将前面加上use master 信息追加到 最前面

set @s_add='type '+@path+@sp+CAST(@id as varchar)+@savetype+'>>'+@path+@sp+@savetype
exec xp_cmdshell @s_add

set @s_add='echo GO>>'+@path+@sp+@savetype
exec xp_cmdshell @s_add 

if @sysproc='1'
begin
 --在最后面加上标记为系统存储过程
 set @s_add='echo  exec sp_MS_marksystemobject  ''['+@sp+']''>>'+@path+@sp+@savetype
 exec xp_cmdshell @s_add
 
 set @s_add='echo GO>>'+@path+@sp+@savetype
 exec xp_cmdshell @s_add
 print '标记第['+cast(@id as varchar)+']个为系统存储过程:'+@sp
end

set @s_add='del '+@path+@sp+CAST(@id as varchar)+@savetype
exec xp_cmdshell @s_add
print '生成第['+cast(@id as varchar)+']个存储过程:'+@sp
delete from tempdb..#T where id=@id
set @id=@id+1
end

 

 


 

此存储过程可以完善的功能

1、生成视图

2、生成函数

3、生成指定库的表结构

4、生成指定库的约束,用于批量生成升级脚本

5、用于生成数据库中升级的脚本  

 

欢迎大家帮我想想,还有别的办法吗?希望加QQ282329611交流。


 

生成结果如图:

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值