我们都知道, SQL server2008R2 企业版以及一些其它的版本支持分区函数, 当你在这些数据库备份后想在一些不支持分区函数的数据库做还原时, 就会失败.
下面我们来解决这个问题.
1. 备份数据库! 备份数据库! 备份数据库! (对数据库动任何刀子前先备份)
2. 删除分区函数所涉及的表, 因为在建表的时候我们做了关联, 所以删除主要是切断这个关联以及相关的文件.
3. 删除关联, 删除分区文件 sql 语句如下
select * from sys.partition_schemes 查询分区
select * from sys.partition_range_values 查询分区范围
select * from sys.partition_functions 查询分区函数
DROP PARTITION SCHEME 查询分区.[name]
DROP PARTITION FUNCTION 查询分区函数.[name]
执行 Drop 语句后再做上面的查询应该已经查不到任何内容.
删除分区文件
ALTER DATABASE [DataBase] REMOVE FILE [分区文件名];
ALTER DATABASE [DataBase] REMOVE FILEGROUP [分区文件组名]
名称可以通过对应库的创建脚本查看
.
.
.
可能有多个这样的分区和分区组手动一一执行吧
到这里所有的删除就已经完成了, 备份, 还原, 成功!
这里再多分享一个我碰到的问题, 上面的方法在高版本 (sqlserver2016) 下已经没有问题, 但是碰到需要还原的数据库为低版本有兼容性问题, 这个问题碰到过很多次, 我的方法是在高版本下生成创建数据库的脚本和创建数据库数据的脚本, 这里脚本的内容可能比较大会造成打不开的情况. 所以就用远程创建一个链接服务器, 将数据倒插入低版本数据库. 有余表的数量较多, 不可能每一个都手动来, 这里提供一个脚本来生成这些插入语句.
declare @name nvarchar(50)
declare @sqltable table (sqlstr nvarchar(2000)) -- 插入语句的临时表
declare @para nvarchar(1000) -- 表列名串, 因为 SET IDENTITY_INSERT 语句需要有列名的情况下才可以使用, 这里需要将列名拼接起来
DECLARE MyCursor CURSOR
FOR SELECT Name FROM SysObjects Where XType='U'-- 查询库里的所有表然后遍历
-- 打开一个游标
OPEN MyCursor
-- 匹配第一条记录
- FETCH NEXT FROM MyCursor INTO @name
- WHILE @@FETCH_STATUS =0
- BEGIN
- select @para = stuff((select ','+ltrim(name) from SYSCOLUMNS where ID=OBJECT_ID(@name )
- for xml path('')),1,1,'')
if exists (Select 1 From sysColumns Where id=object_id(@name) and Status=128)-- 判断是否存在标识键(一般是 ID 自增)
- insert into @sqltable values(
- 'SET IDENTITY_INSERT'+@name+'ON'+'insert into'+@name+'('+@para+') select'+@para+'from [链接服务器的库]..'+@name+'SET IDENTITY_INSERT'+@name+'OFF'
- )
- else
- insert into @sqltable values ('insert into'+@name + 'select * from [链接服务器的库]..'+@name)
- FETCH NEXT FROM MyCursor INTO @name
- END
-- 关闭游标
CLOSE MyCursor
-- 释放资源
- DEALLOCATE MyCursor
- select * from @sqltable
将查询结果全部复制出来遍可以执行了.
来源: http://www.bubuko.com/infodetail-2916033.html