手机
当前位置:查字典教程网 >编程开发 >mssql数据库 >SQLServer 2008数据库降级到2005低版本
SQLServer 2008数据库降级到2005低版本
摘要:由于目前还广泛使用着SQLServer2000,很多公司又想使用新的SQLServer,从而直接【分离/附加】或者【备份/还原】数据库,在不...

由于目前还广泛使用着SQLServer2000,很多公司又想使用新的SQLServer,从而直接【分离/附加】或者【备份/还原】数据库,在不同版本之间存放。往往就会遇到版本不兼容的问题。前几天遇到了从我本机2008R2上备份的一个数据库还原到2008上面时报错:

SQLServer 2008数据库降级到2005低版本1

从运行版本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:右键你要降级的数据库,按下图选择:

SQLServer 2008数据库降级到2005低版本2

步骤2:在对话框中选择:

SQLServer 2008数据库降级到2005低版本3

步骤3:在【高级】中选择下图:

SQLServer 2008数据库降级到2005低版本4

步骤4:把脚本保存起来,然后在SQLServer2005中运行脚本。详细步骤可以看:http://bbs.csdn.net/topics/390438560?page=1#post-394316973中的13楼的回复,有截图步骤5:通过【任务】→【导入数据】,把数据从2008导入到使用脚本创建的库上如下图,就完成了:

SQLServer 2008数据库降级到2005低版本5

方法二:使用系统自带的存储过程实现: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 2008

返回代码值

0(成功)或 1(失败)

注意事项:

后续版本的 Microsoft SQL Server 将删除该功能。请不要在新的开发工作中使用该功能,并尽快修改当前还在使用该功能的应用程序。 改为使用 ALTER DATABASE 兼容级别。

关于备份,可以看我的另外一篇文章。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持查字典教程网。

【SQLServer 2008数据库降级到2005低版本】相关文章:

SQL Server 2005中更改sa的用户名的方法

SQL Server 2005 镜像构建手册(sql2005数据库同步镜像方案)

SQL Server 2008网络协议深入理解

SQL Server 2008商业智能详解

SQL Server数据库管理员(DBA)的工作内容

Sql Server 2000删除数据库备份文件

SQL Server 2005 模板参数使用说明

SQL server 2008 数据库优化常用脚本

SQL Server 2008数据库误删数据如何进行数据恢复

通过SQLServer 2008 操作 MySQL的方法

精品推荐
分类导航