sqlserver删除表分区
我们都知道,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 @sqltabledrop删除表
将查询结果全部复制出来遍可以执⾏了
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论