分享

数据库由高版本降为低版本

 glxym 2017-03-28

     微软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.最后,将视图/函数/存储过程等其他内容通过脚本创建起来.
      其实,我们真正需要解决的是如何将数据自动导入,其他的,都是通过自动生成的脚本来实现的

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多