SQLServer数据库从高版本降级到低版本实例详解

由于目前还广泛使用着SQLServer2000,很多公司又想使用新的SQLServer,从而直接【分离/附加】或者【备份/还原】数据库,在不同版本之间存放。往往就会遇到版本不兼容的问题。前几天遇到了从我本机2008R2上备份的一个数据库还原到2008上面时报错:
从运行版本10.50.2500(2008R2是10.50)和10.00.1600(2008是10.00)中可以看出这个版本不兼容问题,大部分情况下,从低版本升级到高版本,只要不是跨度太大,如2000升级到2012,都不会怎么报错。除非使用了一些新版本不兼容的特性如*=来实现left join的语句。但是就像上图那样,从高版本还原到低版本的时候,问题就出现了,而且几乎一定会报错。
下面给出几个小建议,例子是从2008 降级到2005:
方法一:使用图形化操作(GUI),打开SSMS(SQL Server Management Studio)
步骤1:右键你要降级的数据库,按下图选择:
步骤2:在对话框中选择:
步骤3:在【高级】中选择下图:
步骤4:把脚本保存起来,然后在SQLServer2005中运行脚本。
详细步骤可以看:http://bbs.csdn.net/topics/390438560?page=1#post-394316973 中的13楼的回复,有截图
步骤5:通过【任务】→【导入数据】,把数据从2008导入到使用脚本创建的库上如下图,就完成了:
方法二:使用系统自带的存储过程实现:sp_dbcmptlevel ——将某些数据库行为设置为与指定的 SQL Server 版本兼容
下面是其内部实现代码:
SET QUOTED_IDENTIFIER ON
SET ANSI_NULLS ON
GO
create procedure sys.sp_dbcmptlevel -- 1997/04/15
@dbname sysname = NULL, -- database name to change
@new_cmptlevel tinyint = NULL OUTPUT -- the new compatibility level to change to
as
set nocount on
declare @exec_stmt nvarchar(max)
declare @returncode int
declare @comptlevel float(8)
declare @dbid int -- dbid of the database
declare @dbsid varbinary(85) -- id of the owner of the database
declare @orig_cmptlevel tinyint -- original compatibility level
declare @input_cmptlevel tinyint -- compatibility level passed in by user
,@cmptlvl80 tinyint -- compatibility to SQL Server Version 8.0
,@cmptlvl90 tinyint -- compatibility to SQL Server Version 9.0
,@cmptlvl100 tinyint -- compatibility to SQL Server Version 10.0
select @cmptlvl80 = 80,
@cmptlvl90 = 90,
@cmptlvl100 = 100
-- SP MUST BE CALLED AT ADHOC LEVEL --
if (@@nestlevel > 1)
begin
raiserror(15432,-1,-1,'sys.sp_dbcmptlevel')
return (1)
end
-- If no @dbname given, just list the valid compatibility level values.
if @dbname is null
begin
raiserror (15048, -1, -1, @cmptlvl80, @cmptlvl90, @cmptlvl100)
return (0)
end
-- Verify the database name and get info
select @dbid = dbid, @dbsid = sid ,@orig_cmptlevel = cmptlevel
from master.dbo.sysdatabases
where name = @dbname
-- If @dbname not found, say so and list the databases.
if @dbid is null
begin
raiserror(15010,-1,-1,@dbname)
print ' '
select name as 'Available databases:'
from master.dbo.sysdatabases
return (1)
end
-- Now save the input compatibility level and initialize the return clevel
-- to be the current clevel
select @input_cmptlevel = @new_cmptlevel
select @new_cmptlevel = @orig_cmptlevel
-- If no clevel was supplied, display and output current level.
if @input_cmptlevel is null
begin
raiserror(15054, -1, -1, @orig_cmptlevel)
return(0)
end
-- If invalid clevel given, print usage and return error code
-- 'usage: sp_dbcmptlevel [dbname [, compatibilitylevel]]'
if @input_cmptlevel not in (@cmptlvl80, @cmptlvl90, @cmptlvl100)
begin
raiserror(15416, -1, -1)
print ' '
raiserror (15048, -1, -1, @cmptlvl80, @cmptlvl90, @cmptlvl100)
return (1)
end
-- Only the SA or the dbo of @dbname can execute the update part
-- of this procedure sys.so check.
if (not (is_srvrolemember('sysadmin') = 1)) and suser_sid() <> @dbsid
-- ALSO ALLOW db_owner ONLY IF DB REQUESTED IS CURRENT DB
and (@dbid <> db_id() or is_member('db_owner') <> 1)
begin
raiserror(15418,-1,-1)
return (1)
end
-- If we're in a transaction, disallow this since it might make recovery impossible.
set implicit_transactions off
if @@trancount > 0
begin
raiserror(15002,-1,-1,'sys.sp_dbcmptlevel')
return (1)
end
set @exec_stmt = 'ALTER DATABASE ' + quotename(@dbname, '[') + ' SET COMPATIBILITY_LEVEL = ' + cast(@input_cmptlevel as nvarchar(128))
-- Note: database @dbname may not exist anymore
exec(@exec_stmt)
select @new_cmptlevel = @input_cmptlevel
return (0) -- sp_dbcmptlevel
GO
语法
sp_dbcmptlevel [ [ @dbname = ] name ] [ , [ @new_cmptlevel = ] version ]
参数
[ @dbname = ] name
要为其更改兼容级别的数据库的名称。数据库名称必须符合标识符的规则。name 的数据类型为 sysname,默认值为 NULL。
[ @new_cmptlevel = ] version
数据库要与之兼容的 SQL Server 的版本。version 的数据类型为 tinyint,默认值为 NULL。该值必须为下列值之一:
80 = SQL Server 2000
90 = SQL Server 2005
100 = SQL Server 200
返回代码值
0(成功)或 1(失败)
注意事项:
后续版本的 Microsoft SQL Server 将删除该功能。请不要在新的开发工作中使用该功能,并尽快修改当前还在使用该功能的应用程序。 改为使用 ALTER DATABASE 兼容级别。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
# SQLServer数据库从高版本降级到低版本
# SQLServer高版本降级到低版
# SQLServer 2008数据库降级到2005低版本
# SQL Server 2005降级到2000的正确操作步骤分享
# SQL Server 2012降级至2008R2的方法
# 不兼容
# 升级到
# 报错
# 值为
# 到低
# 几个
# 就会
# 就像
# 还在
# 你要
# 右键
# 是从
# 太大
# 希望能
# 从我
# 可以看出
# 按下
# 与之
# 前几天
# 谢谢大家
相关文章:
建站主机CVM配置优化、SEO策略与性能提升指南
广平建站公司哪家专业可靠?如何选择?
如何快速搭建支持数据库操作的智能建站平台?
如何选择PHP开源工具快速搭建网站?
c# await 一个已经完成的Task会发生什么
小型网站建站如何选择虚拟主机?
金*站制作公司有哪些,金华教育集团官网?
如何在Golang中使用replace替换模块_指定本地或远程路径
如何在建站之星网店版论坛获取技术支持?
网站制作专业公司有哪些,如何制作一个企业网站,建设网站的基本步骤有哪些?
宝塔新建站点为何无法访问?如何排查?
潍坊网站制作公司有哪些,潍坊哪家招聘网站好?
建站之星代理商如何保障技术支持与售后服务?
惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?
C++如何使用std::optional?(处理可选值)
建站ABC备案流程中有哪些关键注意事项?
建站主机无法访问?如何排查域名与服务器问题
娃派WAP自助建站:免费模板+移动优化,快速打造专业网站
教育培训网站制作流程,请问edu教育网站的域名怎么申请?
官网自助建站平台指南:在线制作、快速建站与模板选择全解析
建站之星展会模板:智能建站与自助搭建高效解决方案
宝塔面板创建网站无法访问?如何快速排查修复?
如何自定义建站之星模板颜色并下载新样式?
微网站制作教程,我微信里的网站怎么才能复制到浏览器里?
我的世界制作壁纸网站下载,手机怎么换我的世界壁纸?
香港服务器网站生成指南:免费资源整合与高速稳定配置方案
视频网站app制作软件,有什么好的视频聊天网站或者软件?
网页制作模板网站推荐,网页设计海报之类的素材哪里好?
如何通过云梦建站系统实现SEO快速优化?
小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?
,制作一个手机app网站要多少钱?
油猴 教程,油猴搜脚本为什么会网页无法显示?
建站主机功能解析:服务器选择与快速搭建指南
兔展官网 在线制作,怎样制作微信请帖?
定制建站策划方案_专业建站与网站建设方案一站式指南
如何规划企业建站流程的关键步骤?
北京营销型网站制作公司,可以用python做一个营销推广网站吗?
云南网站制作公司有哪些,云南最好的招聘网站是哪个?
清单制作人网站有哪些,近日“兴风作浪的姑奶奶”引起很多人的关注这是什么事情?
网站制作多少钱一个,建一个论坛网站大约需要多少钱?
如何彻底卸载建站之星软件?
如何正确下载安装西数主机建站助手?
如何在西部数码注册域名并快速搭建网站?
制作门户网站的参考文献在哪,小说网站怎么建立?
大型企业网站制作流程,做网站需要注册公司吗?
巅云智能建站系统:可视化拖拽+多端适配+免费模板一键生成
如何获取PHP WAP自助建站系统源码?
标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?
小米网站链接制作教程,请问miui新增网页链接调用服务有什么用啊?
青岛网站建设如何选择本地服务器?
*请认真填写需求信息,我们会在24小时内与您取得联系。