当前位置:七道奇文章资讯数据防范MSSQL防范
日期:2012-06-27 05:01:00  来源:本站整理

将mater库中的系统存储历程批量生成*.sql文件 通用且非常实用[MSSQL防范]

赞助商链接



  本文“将mater库中的系统存储历程批量生成*.sql文件 通用且非常实用[MSSQL防范]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
大家都知道系统存储历程是无法用工具导出的(大家可以试试 >任务>生成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交流.

生成后果如图:


  以上是“将mater库中的系统存储历程批量生成*.sql文件 通用且非常实用[MSSQL防范]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • 将mater库中的系统存储历程批量生成*.sql文件 通用且非常实用
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .