动态批量导入视图,存储过程及触发器

之前公司要做一个企业老版本升级工作,需要保留旧数据库的数据,并且升级到新数据库的结构,在之前的结构都已经完成,但新的数据库视图,存储过程及触发器太多,不想手动导出成sql文件再发送给企业,让企业升级。所以花了一天的研究,做了如下的方案:

 

1、新数据库名称为T65,数据库包含了存储过程,触发器,视图和表,但无数据(新客户使用的数据库,已存在)

2、写下面一段sql语句,如下:

 

 

USE EMan
GO
-- 附加数据库 
IF NOT EXISTS(select * From master.dbo.sysdatabases where name='T65') 
BEGIN
	EXEC sp_attach_db @dbname = 'T65',   
		@filename1 = 'c:\upem\T65.mdf',   
		@filename2 = 'c:\upem\T65_log.ldf'
END
GO


-- 删除旧数据库所有的存储过程,视图与触发器
DECLARE @col NVARCHAR(50);
DECLARE @sql NVARCHAR(256);
DECLARE datas CURSOR FOR SELECT name, CASE WHEN xtype ='P' THEN 'PROCEDURE' WHEN xtype ='V' THEN 'VIEW' ELSE 'TRIGGER' END col
							FROM sysobjects WHERE xtype IN ('TR','V') OR (category = 0 AND xtype ='P') ORDER BY xtype, name
OPEN datas;
FETCH next FROM datas INTO @sql, @col;
WHILE @@FETCH_STATUS=0
BEGIN
	EXEC('DROP ' + @col + ' ' + @sql)
	FETCH next FROM datas INTO @sql, @col;
END;
CLOSE datas;
DEALLOCATE datas;
GO

-- 根据临时数据库批量添加存储过程,视图与触发器
DECLARE @sql NVARCHAR(MAX);
DECLARE @col NVARCHAR(100);
DECLARE datas CURSOR FOR 
	SELECT com.text,obs.name
	FROM T65.dbo.sysobjects obs INNER JOIN T65.dbo.syscomments com ON obs.id = com.id
	WHERE obs.xtype IN ('TR', 'V') OR (obs.category = 0 AND obs.xtype = 'P')
	ORDER BY obs.xtype DESC, obs.name
OPEN datas;
FETCH next FROM datas INTO @sql, @col;
WHILE @@FETCH_STATUS=0
BEGIN
	if ( @sql is not null)
	BEGIN
		EXEC sp_executesql @sql;
		if @@error <>0
			print @sql;
	END;	
	FETCH next FROM datas INTO @sql, @col;
END;
CLOSE datas;
DEALLOCATE datas;
GO



-- 分离数据库
IF EXISTS(select * From master.dbo.sysdatabases where name='T65') 
	EXEC sp_detach_db @dbname = 'T65'

  说明:EMan 代表企业旧数据库;T65 代表新数据库;以上代码在sql server 2005上测试成功

你可能感兴趣的:(sql,view,trigger,procedure)