由于目前还广泛使用着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中运行脚本。
步骤5:通过【任务】→【导出数据】,把数据从2008导入到使用脚本创建的库上如下图,就完成了:

方法二:使用系统自带的存储过程实现:sp_dbcmptlevel?——将某些数据库行为设置为与指定的 SQL Server 版本兼容
下面是其内部实现代码:
[sql]?
view plain
copy
print
?
- SET?QUOTED_IDENTIFIER?ON??
- ?SET?ANSI_NULLS?ON??
- ?GO??
- create?procedure?sys.sp_dbcmptlevel??????????????
- ????@dbname?sysname?=?NULL,???????????????????
- ????@new_cmptlevel?tinyint?=?NULL?OUTPUT??????
- ?as??
- ????set?nocount????on??
- ???
- declare?@exec_stmt?nvarchar(max)??
- ????declare?@returncode?int??
- declare?@comptlevel?float(8)??
- declare?@dbid?int?????????????????????
- declare?@dbsid?varbinary(85)??????????
- declare?@orig_cmptlevel?tinyint???????
- declare?@input_cmptlevel?tinyint??????
- ????????,@cmptlvl80?tinyint???????????????
- ????????,@cmptlvl90?tinyint???????????????
- --?compatibility?to?SQL?Server?Version?10.0??
- select??@cmptlvl80?=?80,??
- ????????????@cmptlvl90?=?90,??
- ????????????@cmptlvl100?=?100??
- ??????
- ????if?(@@nestlevel?>?1)??
- begin??
- ????????raiserror(15432,-1,'sys.sp_dbcmptlevel')??
- ????????return?(1)??
- end??
- ???
- ??????
- ????if?@dbname?is?null??
- begin??
- ???????raiserror?(15048,?-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? ????????raiserror(15010,@dbname)??
- ????????print?'?'??
- select?name?as?'Available?databases:'??
- ????????????from?master.dbo.sysdatabases??
- --?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?null??
- ????????raiserror(15054,?@orig_cmptlevel)??
- return(0)??
- --?If?invalid?clevel?given,?print?usage?and?return?error?code??
- --?'usage:?sp_dbcmptlevel?[dbname?[,?compatibilitylevel]]'??
- ????if?@input_cmptlevel?not?in?(@cmptlvl80,?@cmptlvl100)??
- ????????raiserror(15416,?-1)??
- ????????print?'?'??
- ????????raiserror?(15048,?@cmptlvl100)??
- --??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??
- ??????????
- ????????and?(@dbid?<>?db_id()?or?is_member('db_owner')?<>?1)??
- ????????raiserror(15418,-1)??
- --?If?we're?in?a?transaction,?disallow?this?since?it?might?make?recovery?impossible.??
- set?implicit_transactions?off??
- ????if?@@trancount?>?0??
- ????????raiserror(15002,153); background-color:inherit; font-weight:bold">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)???
- ???
语法
[sql]?
view plain
copy
print
?
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 2008
返回代码值
0(成功)或 1(失败)
注意事项:
后续版本的 Microsoft SQL Server 将删除该功能。请不要在新的开发工作中使用该功能,并尽快修改当前还在使用该功能的应用程序。 改为使用 ALTER DATABASE 兼容级别。 原文链接:http://blog.csdn.net/dba_huangzj/article/details/7952403
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|