最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 正文

如何把SQL Server数据库从高版本降级到低版本

来源:动视网 责编:小OO 时间:2025-09-27 08:21:58
文档

如何把SQL Server数据库从高版本降级到低版本

如何把SQLServer数据库从高版本降级到低版本如何把SQLServer数据库从高版本降级到低版本 由于目前还广泛使用着SQLServer2000,很多公司又想使用新的SQLServer,从而直接【分离/附加】或者【备份/还原】数据库,在不同版本之间存放。往往就会遇到版本不兼容的问题。前几天遇到了从我本机2008R2上备份的一个数据库还原到2008上面时报错: 从运行版本10.50.2500(2008R2是10.50)和10.00.1600(2008是10.00)中可以看出这个版本不兼容问题
推荐度:
导读如何把SQLServer数据库从高版本降级到低版本如何把SQLServer数据库从高版本降级到低版本 由于目前还广泛使用着SQLServer2000,很多公司又想使用新的SQLServer,从而直接【分离/附加】或者【备份/还原】数据库,在不同版本之间存放。往往就会遇到版本不兼容的问题。前几天遇到了从我本机2008R2上备份的一个数据库还原到2008上面时报错: 从运行版本10.50.2500(2008R2是10.50)和10.00.1600(2008是10.00)中可以看出这个版本不兼容问题
如何把SQL Server数据库从高版本降级到低版本

如何把SQL Server数据库从高版本降级到低版本

 

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

 

从运行版本10.50.2500(2008R2是10.50)和10.00.1600(2008是10.00)中可以看出这个版本不兼容问题,大部分情况下,从低版本升级到高版本,只要不是跨度太大,如2000升级到2012,都不会怎么报错。除非使用了一些新版本不兼容的特性如*=来实现left join的语句。但是就像上图那样,从高版本还原到低版本的时候,问题就出现了,而且几乎一定会报错。

 

下面给出几个小建议,例子是从2008 降级到2005:  www.2cto.com  

方法一:使用图形化操作(GUI),打开SSMS(SQL Server Management Studio)

步骤1:右键你要降级的数据库,按下图选择:

 

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

 

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

 

步骤4:把脚本保存起来,然后在SQLServer2005中运行脚本。

 

步骤5:通过【任务】→【导出数据】,把数据从2008导入到使用脚本创建的库上如下图,就完成了:

 

 

方法二:使用系统自带的存储过程实现:sp_dbcmptlevel ——将某些数据库行为设置为与指定的 SQL Server 版本兼容

下面是其内部实现代码:

 

[sql] 

SET QUOTED_IDENTIFIER ON  

 SET ANSI_NULLS ON  

 GO    www.2cto.com  

 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    www.2cto.com  

    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    www.2cto.com  

        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.    www.2cto.com  

    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  

   

语法

[sql] 

sp_dbcmptlevel [ [ @dbname = ] name ]   

     [ , [ @new_cmptlevel = ] version ]  

 

参数

[ @dbname = ] name

要为其更改兼容级别的数据库的名称。数据库名称必须符合标识符的规则。name 的数据类型为 sysname,默认值为 NULL。  www.2cto.com  

[ @new_cmptlevel = ] version

数据库要与之兼容的 SQL Server 的版本。version 的数据类型为 tinyint,默认值为 NULL。该值必须为下列值之一:

 

80 = SQL Server 2000

90 = SQL Server 2005

100 = SQL Server 2008

返回代码值

0(成功)或 1(失败)

SQL Server 2012将数据导出为脚本详细图解

注意事项:

 

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

前记:

从SQL SERVER 2008开始,我们就可以很方便的导出数据脚本,而无需再借助存储过程,但是SQL Server 2012和SQL Server 2008的导出脚本的过程还有一点细微的差别,我在这里详细的介绍一下。

在SQL Server 2012中我们无法直接找到例如下图中的编写数据的脚本的选项。   www.2cto.com  

 

对于SQL Server 2008来说,我们可以在SSMS2008中的对象资源管理器中,右击需要导出数据的数据库,在弹出的菜单中选择“任务”下的“生成脚本”选项。

在脚本想到的选择脚本呢选项中,将“编写数据的脚本”选择为TRUE,这里默认是FALSE的。    www.2cto.com  

 

下面我在SQL Server 2012中来详细图解一下这个过程。

我新建了一个名为BlogDB的数据库,里面只有一张表TestTable,表中有一些杂乱的测试数据。

右键该数据库,然后选择“任务”,选择“生成脚本”。      www.2cto.com  

 

点击下一步。

再点击下一步。

这个时候不要着急点下一步,我们先点击“高级(A)”按钮。    www.2cto.com  

 

我们在里面没有看到类似SQL Server 2008中的编写数据的脚本,TRUE和FALSE的选项,但是有个功能相似的选项,如下图。    www.2cto.com  

 

如果我们要导出数据的表结构和表脚本,把要编写脚本的数据的类型,从仅限架构改成架构和数据,点“确定”。

我们可以把脚本保持到文件,保存到剪贴板,或是保存到新建查询窗体,我个人习惯保存到文件。

这里可以修改文件的保存路径,可以给文件命名,例如我给文件起名为BlogDB.sql。

然后点击下一步。     www.2cto.com  

 

点击下一步 。

点击完成即可,然后我们到指定目录去找这个文件。    www.2cto.com  

 

打开这个文件我们可以看到:

这个脚本就是我们想要的结果了。

 

文档

如何把SQL Server数据库从高版本降级到低版本

如何把SQLServer数据库从高版本降级到低版本如何把SQLServer数据库从高版本降级到低版本 由于目前还广泛使用着SQLServer2000,很多公司又想使用新的SQLServer,从而直接【分离/附加】或者【备份/还原】数据库,在不同版本之间存放。往往就会遇到版本不兼容的问题。前几天遇到了从我本机2008R2上备份的一个数据库还原到2008上面时报错: 从运行版本10.50.2500(2008R2是10.50)和10.00.1600(2008是10.00)中可以看出这个版本不兼容问题
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top