将一个数据库中的存储过程,复制到另一数据库

  1use master
  2go
  3
  4if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[sp_copyProce]'and 
  5
  6OBJECTPROPERTY(id, N'IsProcedure'= 1)
  7drop procedure [dbo].[sp_copyProce]
  8GO
  9
 10/*--生成表数据脚本的通用存储过程,
 11
 12    功能:将一个数据库中的存储过程,复制到另一数据库中
 13    目标数据库中已经有的存储过程不覆盖
 14
 15--邹建 2005.01(引用请保留此信息)--*/

 16
 17/*--调用示例
 18
 19    exec master.dbo.sp_copyProce 'a','b'
 20--*/

 21
 22create proc sp_copyProce
 23@s_dbname sysname, --要复制存储过程的源数据库名
 24@d_dbname sysname  --目标数据库名
 25as
 26set nocount on
 27if db_id(@s_dbnameis null
 28begin
 29    raiserror('数据库"%s"不存在',1,16,@s_dbname)
 30    return
 31end
 32if db_id(@d_dbnameis null
 33begin
 34    raiserror('数据库"%s"不存在',1,16,@d_dbname)
 35    return
 36end
 37select @s_dbname='['+replace(@s_dbname,']',']]')+']'
 38    ,@d_dbname='['+replace(@d_dbname,']',']]')+']'
 39
 40--复制存储过程信息到临时表
 41create table #sys_syscomments_bak(name sysname,xtype char(2),number smallint,colid 
 42
 43smallint,status smallint,ctext varbinary(8000))
 44exec('
 45insert #sys_syscomments_bak
 46    (name,xtype,number,colid,status,ctext)
 47select o.name,o.xtype,c.number,c.colid,c.status,c.ctext
 48from '+@s_dbname+'.dbo.syscomments c,'+@s_dbname+'.dbo.sysobjects o
 49where c.id=o.id 
 50    and o.status>=0
 51    and o.xtype=''P''
 52    and not exists(
 53        select * from '+@d_dbname+'.dbo.sysobjects where name=o.name)
 54')
 55
 56--创建存储过程
 57declare tb cursor local for
 58select 'use '+@d_dbname+' exec(''create proc dbo.['+replace(name,N']',N']]')+'] as --'')  
 59
 60exec sp_recompile ['+replace(name,N']',N']]')+']'
 61from #sys_syscomments_bak
 62declare @s nvarchar(4000)
 63open tb
 64fetch tb into @s
 65while @@fetch_status=0
 66begin
 67    exec(@s)
 68    fetch tb into @s
 69end
 70close tb
 71deallocate tb
 72
 73--复制存储过程结构
 74exec sp_configure 'allow updates',1 reconfigure with override
 75begin tran
 76    exec('
 77    delete c
 78    from '+@d_dbname+'.dbo.syscomments c,'+@d_dbname+'.dbo.sysobjects 
 79
 80o,#sys_syscomments_bak ob
 81    where c.id=o.id and o.name=ob.name and o.xtype=ob.xtype
 82    insert '+@d_dbname+'.dbo.syscomments([id],[number],[colid],[status],[ctext])
 83    select o.[id],ob.[number],ob.[colid],ob.[status],ob.[ctext]
 84    from '+@d_dbname+'.dbo.sysobjects o,#sys_syscomments_bak ob
 85    where o.name=ob.name and o.xtype=ob.xtype')
 86commit tran
 87exec sp_configure 'allow updates',0 reconfigure with override
 88go
 89
 90
 91--使用测试
 92create database a
 93go
 94use a
 95go
 96create proc p_test1
 97as
 98select 'test1'
 99go
100
101
102create proc p_test2
103as
104select 'test2'
105go
106
107create database b
108go
109
110exec master.dbo.sp_copyProce 'a','b'
111go
112select * from b.dbo.sysobjects where xtype='P'
113
114exec b.dbo.p_test1
115exec b.dbo.p_test2
116go
117
118use master
119go
120
121drop database a,b
122drop proc sp_copyProce
posted @ 2005-12-26 13:21  torome  阅读(1493)  评论(0编辑  收藏  举报