如何将数据库由高版本降为低版本

微软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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值