微软SQL Server是很多企业的理想选择,新的版本通常更快更强大,我们也会迫不及待把老版本数据库升级为新版本,这无可厚非,通常也非常顺利,在老版本中备份数据库,然后在新版本数据库中恢复一下就可以了,微软自己的东西,兼容性通常不是问题,但有时我们需要回到低版本,比如客户只有低版本的数据库等情况,如果我们要把高版本的数据库备份,然后用低版本数据库来还原,通常是不现实的,升级容易降级难. 这时,我们自然想到了,用脚本来实现,脚本可以完成表/视图/存储过程/函数等创建工作,却无法把数据也导入进来,如果数据库中有几百张表,手工导入数据将会是一场梦魇,为此,我通过一段代码来实现了自动导入功能,具体步骤如下: 1.在低版本数据库中,建立一个到高版本数据库的链接,如果你没有使用过链接服务器,那就百度一下吧,很简单的 2.用sql server的Management studio连接到高版本数据库上,配置一下选项,"SQL Server对象资源管理器"→"编写脚本"中,去掉"包含说明性标头"/"编写USE<数据库>脚本"/"编写if not exists 子句",勾选"编写索引脚本",注意"为服务器版本编写脚本"选择低版本数据库对应的版本,其他选项可以根据实际情况进行设置. 3.在低版本数据库中创建一个数据库,名称和高版本中的一样 4.回到高版本数据库,选择全部的用户表(按F7打开对象资源管理器详细信息),点鼠标右键,选择创建脚本,这时,我们欣喜的发现,创建的脚本分为前后两部分,前面部分是创建了表结构,后面部分对每张表添加约束/关联等信息,我们先把前面部分复制下来,粘贴到低版本数据库里面执行,这样,就创建了表结构. 5.在低版本数据库中执行下面的脚本,将数据从高版本导入: --设置链接数据库名 DECLARE @LinkDB NVARCHAR(100) SELECT @LinkDB='[192.168.1.102,3000].[Station_Center]' --创建一个表变量,存放所有用户表名称 DECLARE @tb TABLE(TableName NVARCHAR(50)) INSERT @tb select [name] int from sysobjects where xtype='U' order by [name]
--定义需要执行的SQL语句、当前操作的表名、表中是否有标识字段 DECLARE @Sql NVARCHAR(3000),@tbName NVARCHAR(50),@IsISIDENTITY BIT
--通过游标,逐一对各表进行数据导入 declare scu_Ticks CURSOR LOCAL FORWARD_ONLY READ_ONLY STATIC for select TableName from @tb open scu_Ticks
fetch from scu_Ticks into @tbName while (@@fetch_status=0) BEGIN --检查是有标识字段,如果有,先关闭 IF EXISTS(SELECT * FROM SYSCOLUMNS A INNER JOIN SYSOBJECTS D ON A.ID=D.ID AND D.XTYPE='U' AND D.NAME<>'DTPROPERTIES' WHERE D.NAME=@tbName AND COLUMNPROPERTY( A.ID,A.NAME,'ISIDENTITY')=1 ) BEGIN SET @IsISIDENTITY=1 END ELSE BEGIN SET @IsISIDENTITY=0 END
SELECT @Sql=' Truncate TABLE '+@tbName IF @IsISIDENTITY =1 --有标识字段,先临时关闭 BEGIN SET @Sql=@Sql+' SET IDENTITY_INSERT '+@tbName+' ON ' END --从链接数据库导入数据 SET @Sql=@Sql+' insert into '+@tbName+' select * from '+ @LinkDB+'.dbo.'+@tbName IF @IsISIDENTITY =1 --恢复标识 BEGIN SET @Sql=@Sql+' SET IDENTITY_INSERT '+@tbName+' OFF ' END EXEC(@Sql)--执行组合的SQL语句 fetch next from scu_Ticks into @tbName end close scu_Ticks deallocate scu_Ticks
6.现在,表中有数据了,再把第4步中生产的脚本的后半部分复制过来执行一下,这样,表之间的关联/约束就有了 7.最后,将视图/函数/存储过程等其他内容通过脚本创建起来. 其实,我们真正需要解决的是如何将数据自动导入,其他的,都是通过自动生成的脚本来实现的
|