如何把SQL Server数据库从高版本降级到低版本.docx
- 文档编号:24560920
- 上传时间:2023-05-28
- 格式:DOCX
- 页数:19
- 大小:1.25MB
如何把SQL Server数据库从高版本降级到低版本.docx
《如何把SQL Server数据库从高版本降级到低版本.docx》由会员分享,可在线阅读,更多相关《如何把SQL Server数据库从高版本降级到低版本.docx(19页珍藏版)》请在冰豆网上搜索。
如何把SQLServer数据库从高版本降级到低版本
如何把SQLServer数据库从高版本降级到低版本
如何把SQLServer数据库从高版本降级到低版本
由于目前还广泛使用着SQLServer2000,很多公司又想使用新的SQLServer,从而直接【分离/附加】或者【备份/还原】数据库,在不同版本之间存放。
往往就会遇到版本不兼容的问题。
前几天遇到了从我本机2008R2上备份的一个数据库还原到2008上面时报错:
从运行版本10.50.2500(2008R2是10.50)和10.00.1600(2008是10.00)中可以看出这个版本不兼容问题,大部分情况下,从低版本升级到高版本,只要不是跨度太大,如2000升级到2012,都不会怎么报错。
除非使用了一些新版本不兼容的特性如*=来实现leftjoin的语句。
但是就像上图那样,从高版本还原到低版本的时候,问题就出现了,而且几乎一定会报错。
下面给出几个小建议,例子是从2008降级到2005:
方法一:
使用图形化操作(GUI),打开SSMS(SQLServerManagementStudio)
步骤1:
右键你要降级的数据库,按下图选择:
步骤2:
在对话框中选择:
步骤3:
在【高级】中选择下图:
步骤4:
把脚本保存起来,然后在SQLServer2005中运行脚本。
步骤5:
通过【任务】→【导出数据】,把数据从2008导入到使用脚本创建的库上如下图,就完成了:
方法二:
使用系统自带的存储过程实现:
sp_dbcmptlevel——将某些数据库行为设置为与指定的SQLServer版本兼容
下面是其内部实现代码:
[sql]
SETQUOTED_IDENTIFIERON
SETANSI_NULLSON
GO
createproceduresys.sp_dbcmptlevel --1997/04/15
@dbnamesysname=NULL, --databasenametochange
@new_cmptleveltinyint=NULLOUTPUT --thenewcompatibilityleveltochangeto
as
setnocount on
declare@exec_stmtnvarchar(max)
declare@returncodeint
declare@comptlevelfloat(8)
declare@dbidint --dbidofthedatabase
declare@dbsidvarbinary(85) --idoftheownerofthedatabase
declare@orig_cmptleveltinyint --originalcompatibilitylevel
declare@input_cmptleveltinyint --compatibilitylevelpassedinbyuser
,@cmptlvl80tinyint --compatibilitytoSQLServerVersion8.0
,@cmptlvl90tinyint --compatibilitytoSQLServerVersion9.0
,@cmptlvl100tinyint --compatibilitytoSQLServerVersion10.0
select @cmptlvl80=80,
@cmptlvl90=90,
@cmptlvl100=100
--SPMUSTBECALLEDATADHOCLEVEL--
if(@@nestlevel>1)
begin
raiserror(15432,-1,-1,'sys.sp_dbcmptlevel')
return
(1)
end
--Ifno@dbnamegiven,justlistthevalidcompatibilitylevelvalues.
if@dbnameisnull
begin
raiserror(15048,-1,-1,@cmptlvl80,@cmptlvl90,@cmptlvl100)
return(0)
end
-- Verifythedatabasenameandgetinfo
select@dbid=dbid,@dbsid=sid,@orig_cmptlevel=cmptlevel
frommaster.dbo.sysdatabases
wherename=@dbname
-- If@dbnamenotfound,saysoandlistthedatabases.
if@dbidisnull
begin
raiserror(15010,-1,-1,@dbname)
print''
selectnameas'Availabledatabases:
'
frommaster.dbo.sysdatabases
return
(1)
end
--Nowsavetheinputcompatibilitylevelandinitializethereturnclevel
--tobethecurrentclevel
select@input_cmptlevel=@new_cmptlevel
select@new_cmptlevel=@orig_cmptlevel
--Ifnoclevelwassupplied,displayandoutputcurrentlevel.
if@input_cmptlevelisnull
begin
raiserror(15054,-1,-1,@orig_cmptlevel)
return(0)
end
--Ifinvalidclevelgiven,printusageandreturnerrorcode
--'usage:
sp_dbcmptlevel[dbname[,compatibilitylevel]]'
if@input_cmptlevelnotin(@cmptlvl80,@cmptlvl90,@cmptlvl100)
begin
raiserror(15416,-1,-1)
print''
raiserror(15048,-1,-1,@cmptlvl80,@cmptlvl90,@cmptlvl100)
return
(1)
end
-- OnlytheSAorthedboof@dbnamecanexecutetheupdatepart
-- ofthisproceduresys.socheck.
if(not(is_srvrolemember('sysadmin')=1))andsuser_sid()<>@dbsid
--ALSOALLOWdb_ownerONLYIFDBREQUESTEDISCURRENTDB
and(@dbid<>db_id()oris_member('db_owner')<>1)
begin
raiserror(15418,-1,-1)
return
(1)
end
--Ifwe'reinatransaction,disallowthissinceitmightmakerecoveryimpossible.
setimplicit_transactionsoff
if@@trancount>0
begin
raiserror(15002,-1,-1,'sys.sp_dbcmptlevel')
return
(1)
end
set@exec_stmt='ALTERDATABASE'+quotename(@dbname,'[')+'SETCOMPATIBILITY_LEVEL='+cast(@input_cmptlevelasnvarchar(128))
--Note:
database@dbnamemaynotexistanymore
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。
[@new_cmptlevel=]version
数据库要与之兼容的SQLServer的版本。
version的数据类型为tinyint,默认值为NULL。
该值必须为下列值之一:
80=SQLServer2000
90=SQLServer2005
100=SQLServer2008
返回代码值
0(成功)或1(失败)
SQLServer2012将数据导出为脚本详细图解
注意事项:
后续版本的MicrosoftSQLServer将删除该功能。
请不要在新的开发工作中使用该功能,并尽快修改当前还在使用该功能的应用程序。
改为使用ALTERDATABASE兼容级别。
前记:
从SQLSERVER2008开始,我们就可以很方便的导出数据脚本,而无需再借助存储过程,但是SQLServer2012和SQLServer2008的导出脚本的过程还有一点细微的差别,我在这里详细的介绍一下。
在SQLServer2012中我们无法直接找到例如下图中的编写数据的脚本的选项。
对于SQLServer2008来说,我们可以在SSMS2008中的对象资源管理器中,右击需要导出数据的数据库,在弹出的菜单中选择“任务”下的“生成脚本”选项。
在脚本想到的选择脚本呢选项中,将“编写数据的脚本”选择为TRUE,这里默认是FALSE的。
下面我在SQLServer2012中来详细图解一下这个过程。
我新建了一个名为BlogDB的数据库,里面只有一张表TestTable,表中有一些杂乱的测试数据。
右键该数据库,然后选择“任务”,选择“生成脚本”。
点击下一步。
再点击下一步。
这个时候不要着急点下一步,我们先点击“高级(A)”按钮。
我们在里面没有看到类似SQLServer2008中的编写数据的脚本,TRUE和FALSE的选项,但是有个功能相似的选项,如下图。
如果我们要导出数据的表结构和表脚本,把要编写脚本的数据的类型,从仅限架构改成架构和数据,点“确定”。
我们可以把脚本保持到文件,保存到剪贴板,或是保存到新建查询窗体,我个人习惯保存到文件。
这里可以修改文件的保存路径,可以给文件命名,例如我给文件起名为BlogDB.sql。
然后点击下一步。
点击下一步。
点击完成即可,然后我们到指定目录去找这个文件。
打开这个文件我们可以看到:
这个脚本就是我们想要的结果了。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 如何把SQL Server数据库从高版本降级到低版本 如何 SQL Server 数据库 版本 降级
![提示](https://static.bdocx.com/images/bang_tan.gif)