如何把SQL Server数据库从高版本降级到低版本.doc_第1页
如何把SQL Server数据库从高版本降级到低版本.doc_第2页
如何把SQL Server数据库从高版本降级到低版本.doc_第3页
如何把SQL Server数据库从高版本降级到低版本.doc_第4页
如何把SQL Server数据库从高版本降级到低版本.doc_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

如何把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: 方法一:使用图形化操作(GUI),打开SSMS(SQL Server Management Studio)步骤1:右键你要降级的数据库,按下图选择:步骤2:在对话框中选择: 步骤3:在【高级】中选择下图:步骤4:把脚本保存起来,然后在SQLServer2005中运行脚本。步骤5:通过【任务】【导出数据】,把数据从2008导入到使用脚本创建的库上如下图,就完成了:方法二:使用系统自带的存储过程实现:sp_dbcmptlevel 将某些数据库行为设置为与指定的 SQL Server 版本兼容下面是其内部实现代码:sqlSET 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 were 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 语法sqlsp_dbcmptlevel dbname = name , new_cmptlevel = version 参数 dbname = name要为其更改兼容级别的数据库的名称。数据库名称必须符合标识符的规则。name 的数据类型为 sysname,默认值为 NULL。 new_cmptlevel = version数据库要与之兼容的 SQL Server 的版本。version 的数据类型为 tinyint,默认值为 NULL。该值必须为下列值之一:80 = SQL Server 200090 = SQL Server 2005100 = 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中我们无法直接找到例如下图中的编写数据的脚本的选项。 对于SQL Server 2008来说,我们可以在SSMS2008中的对象资源管理器中,右击需要导出数据的数据库,在弹出的菜单中选择“任务”下的“生成脚本”选项。在脚本想到的选择脚本呢选项中,将“编写数据的脚本”选择为TRUE,这里默认是FALSE的。 下面我在SQL Server 2012中来详细图解一下这个过程。我新建了一个名为BlogDB的数据库,里面只有一张表TestTable,表中有一些杂乱的测试数据。右键该数据库,然后选择“任务”,选择“生成脚本”。 点击下一步。再点击下一步。这个时候不要着急点下一步,我们先点击“高级(A)”按钮。 我们在里面没有看到类似SQL Server 2008中的编写数据的脚本,TRUE和FALSE的选项,但是有个功能相似的选项,如下图。 www.

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论