名站网址导航为大家提供关于数据库教程相关的教程网站知识。
大家都知道系统存储过程是无法用相关工具导出的(大家可以试试 >任务>生成SQL脚本)SQLServer中字符串左对齐或右对齐显示的sql数据库语句
复制具体相关代码 具体相关代码如下:,declare @sql varchar(200), --需填充的字符串 @char varchar(4), --填充使用的字符 @len int --填充后的长度 select @sql='abc'
因为系统存储过程一般是不让开发人员修改的。
需要知识:
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交流。
生成结果如图:
关于数据库教程相关的教程网站知识今天我们就说到这里了,希望可以帮到大家。