加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

如何把SQLServer数据库从高版本降级到低版本?

发布时间:2020-12-12 13:21:02 所属栏目:MsSql教程 来源:网络整理
导读:由于目前还广泛使用着SQLServer2000,很多公司又想使用新的SQLServer,从而直接【分离/附加】或者【备份/还原】数据库,在不同版本之间存放。往往就会遇到版本不兼容的问题。前几天遇到了从我本机2008R2上备份的一个数据库还原到2008上面时报错: 从运行版本

由于目前还广泛使用着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 版本兼容

下面是其内部实现代码:

[sql]? view plain copy print ?

在CODE上查看代码片

派生到我的代码片

  1. SET?QUOTED_IDENTIFIER?ON??
  2. ?SET?ANSI_NULLS?ON??
  3. ?GO??
  4. create?procedure?sys.sp_dbcmptlevel????????????--?1997/04/15??
  5. ????@dbname?sysname?=?NULL,?????????????????--?database?name?to?change??
  6. ????@new_cmptlevel?tinyint?=?NULL?OUTPUT????--?the?new?compatibility?level?to?change?to??
  7. ?as??
  8. ????set?nocount????on??
  9. ???
  10. declare?@exec_stmt?nvarchar(max)??
  11. ????declare?@returncode?int??
  12. declare?@comptlevel?float(8)??
  13. declare?@dbid?int???????????????????--?dbid?of?the?database??
  14. declare?@dbsid?varbinary(85)????????--?id?of?the?owner?of?the?database??
  15. declare?@orig_cmptlevel?tinyint?????--?original?compatibility?level??
  16. declare?@input_cmptlevel?tinyint????--?compatibility?level?passed?in?by?user??
  17. ????????,@cmptlvl80?tinyint?????????????--?compatibility?to?SQL?Server?Version?8.0??
  18. ????????,@cmptlvl90?tinyint?????????????--?compatibility?to?SQL?Server?Version?9.0??
  19. --?compatibility?to?SQL?Server?Version?10.0??
  20. select??@cmptlvl80?=?80,??
  21. ????????????@cmptlvl90?=?90,??
  22. ????????????@cmptlvl100?=?100??
  23. ????--?SP?MUST?BE?CALLED?AT?ADHOC?LEVEL?--??
  24. ????if?(@@nestlevel?>?1)??
  25. begin??
  26. ????????raiserror(15432,-1,'sys.sp_dbcmptlevel')??
  27. ????????return?(1)??
  28. end??
  29. ???
  30. ????--?If?no?@dbname?given,?just?list?the?valid?compatibility?level?values.??
  31. ????if?@dbname?is?null??
  32. begin??
  33. ???????raiserror?(15048,?-1,?@cmptlvl80,?@cmptlvl90,?@cmptlvl100)??
  34. ???????return?(0)??
  35. end??
  36. --??Verify?the?database?name?and?get?info??
  37. select?@dbid?=?dbid,?@dbsid?=?sid?,@orig_cmptlevel?=?cmptlevel??
  38. from?master.dbo.sysdatabases??
  39. ????????where?name?=?@dbname??
  40. --??If?@dbname?not?found,?say?so?and?list?the?databases.??
  41. ????if?@dbid? ????????raiserror(15010,@dbname)??
  42. ????????print?'?'??
  43. select?name?as?'Available?databases:'??
  44. ????????????from?master.dbo.sysdatabases??
  45. --?Now?save?the?input?compatibility?level?and?initialize?the?return?clevel??
  46. --?to?be?the?current?clevel??
  47. select?@input_cmptlevel?=?@new_cmptlevel??
  48. select?@new_cmptlevel?=?@orig_cmptlevel??
  49. --?If?no?clevel?was?supplied,?display?and?output?current?level.??
  50. ????if?@input_cmptlevel?null??
  51. ????????raiserror(15054,?@orig_cmptlevel)??
  52. return(0)??
  53. --?If?invalid?clevel?given,?print?usage?and?return?error?code??
  54. --?'usage:?sp_dbcmptlevel?[dbname?[,?compatibilitylevel]]'??
  55. ????if?@input_cmptlevel?not?in?(@cmptlvl80,?@cmptlvl100)??
  56. ????????raiserror(15416,?-1)??
  57. ????????print?'?'??
  58. ????????raiserror?(15048,?@cmptlvl100)??
  59. --??Only?the?SA?or?the?dbo?of?@dbname?can?execute?the?update?part??
  60. --??of?this?procedure?sys.so?check.??
  61. ????if?(not?(is_srvrolemember('sysadmin')?=?1))?and?suser_sid()?<>?@dbsid??
  62. ????????--?ALSO?ALLOW?db_owner?ONLY?IF?DB?REQUESTED?IS?CURRENT?DB??
  63. ????????and?(@dbid?<>?db_id()?or?is_member('db_owner')?<>?1)??
  64. ????????raiserror(15418,-1)??
  65. --?If?we're?in?a?transaction,?disallow?this?since?it?might?make?recovery?impossible.??
  66. set?implicit_transactions?off??
  67. ????if?@@trancount?>?0??
  68. ????????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))??
  69. --?Note:?database?@dbname?may?not?exist?anymore??
  70. exec(@exec_stmt)??
  71. select?@new_cmptlevel?=?@input_cmptlevel??
  72. return?(0)?--?sp_dbcmptlevel??
  73. ???

语法

[sql]? view plain copy print ?

在CODE上查看代码片

派生到我的代码片

    sp_dbcmptlevel?[?[?@dbname?=?]?name?]???
  1. ?????[?,?[?@new_cmptlevel?=?]?version?]??
  2. ???



参数

[? @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 兼容级别。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读