동적 대량 가 져 오기 보기, 저장 프로 세 스 및 트리거

2156 단어 SQL
이전에 회 사 는 기업 의 오래된 버 전 업그레이드 작업 을 하려 면 낡은 데이터베이스 의 데 이 터 를 보존 하고 새로운 데이터베이스 구조 로 업그레이드 해 야 한다. 이전의 구 조 는 모두 완성 되 었 지만 새로운 데이터베이스 보기, 저장 과정 과 트리거 가 너무 많아 서 수 동 으로 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 에서 테스트 에 성공 하 였 습 니 다.

좋은 웹페이지 즐겨찾기