我试图将从SQL Server 2012中获取的备份还原到SQL Server 2008 R2,但出现错误。
指定的强制类型转换无效。 (SqlManagerUI)
如果您有任何解决方法,请在评论中提供。
谢谢。
我试图将从SQL Server 2012中获取的备份还原到SQL Server 2008 R2,但出现错误。
指定的强制类型转换无效。 (SqlManagerUI)
如果您有任何解决方法,请在评论中提供。
谢谢。
注意:以上某些答案已经非常过时!这可以在 SQL Server Management Studio (SQL MS)中完成所有操作。
有许多方法可以采用来“降级”数据库,但我最近发现的一种方法是使用复制数据库向导,我认为这种方法在 SQL MS 2012 的早期版本中还没有被发现。以下是如何将一个数据库从 2012 服务器实例复制到 2008 R2 实例:
在 2012 实例中,右键单击要复制/“降级”的数据库,然后选择“任务” > “复制数据库…”。
“欢迎使用复制数据库向导”,点击 [下一步]。
“选择源服务器”: 将“源服务器”设置为 2012 实例(或更高版本的服务器实例),并设置适当的身份验证。 点击 [下一步]. [注意. 必须运行 Server Agent 服务]
“选择目标服务器”: 将“目标服务器”设置为 2008 R2(或更低版本的实例),并设置适当的身份验证。 点击 [下一步]. [注意. 必须运行 Server Agent 服务]
“选择传输方法”: 对于本示例,请选择“使用 SQL Management Object 方法”,然后点击 [下一步]。
选择要移动或复制的数据库,然后点击 [下一步]。
配置目标数据库路径和逻辑名称等。选择数据库存在时所需的选项。 点击 [下一步]。
配置集成服务包,然后点击 [下一步]。
对于本示例,请为“计划包”选项中的“立即运行”选项进行选择。 点击 [下一步]。
“完成向导”,点击 [完成] 执行包并创建“降级”的数据库。
你完成了,愉快的一天 :]
我发现的另一种方法是由微软创建的 SQL 数据库迁移向导,我认为(我不确定)上面的向导就是由它创建的。可以在此处获取 http://sqlazuremw.codeplex.com/。要使用此程序包将数据库从 SQL Server 2012 迁移到 2008 R2,您可以执行以下步骤:
注意:微软已经从 Codeplex 中删除了 SQLAzureMW。我个人将其提供在这里
运行 SQLAzureMW.exe。
从主窗口右侧选择分析/迁移单选按钮。
将目标服务器选择为“SQL 数据库最新服务版本(V12)”。单击 [下一步]。
连接到 SQL Server 2012 实例。我的机器上的服务器名称为“VAIOE\SQLSERVER2012”,使用 Windows 身份验证,在数据库选项中选择“Master DB (列出所有数据库)”,并选择“保存登录信息”。单击 [连接]。
选择要迁移的所需数据库[目前使用 GVH 报告数据库]。单击 [下一步]。
选择“脚本所有数据库对象”。
单击 [高级] 并更改以下选项:
a. 在“常规”下,将“目标服务器”设置为“SQL Server”。
b. 在“表/视图选项”下,将“脚本表/数据”设置为“带有表模式的数据”。将“数据库引擎存储过程”设置为“True”。将“安全函数”、“安全存储过程”和“系统函数”设置为“True”。
单击 [确定]。单击 [下一步]。
检查您的选择。单击 [下一步]。
你将会看到提示“准备生成脚本?”,点击[是]。这会开始生成脚本。完成后,点击[下一步]。
现在你会看到另一个连接对话框。这次选中目标服务器上的数据库(SQL Server 2008 R2实例)。选择Master数据库以便你可以选择目标数据库。点击[连接]。
现在,你可能想要迁移到一个新的数据库,所以点击[创建数据库]。
输入一个数据库目标名称并将“排序规则”保留为空,这与我们无关。点击[创建数据库]。点击[下一步]。
现在会提示你“在目标服务器上执行脚本?”,点击[是]。
这将会做许多工作,使用生成的脚本设置模式,但不像之前我们发现的方法,数据是使用BCP进行大容量加载的,速度非常快。所有这些都是在内部完成的,因此不会生成大量的.sql脚本文件等。
点击[退出]。
完成了。现在如果你打开管理工具并连接到我们刚刚使用过的SQL Server 2012和2008 R2实例,你会发现2012源数据库的模式与刚刚创建的目标数据库相匹配。
以上两个过程几乎相同且提供了相同的功能。除非你明确需要迁移到Azure或方法1对你不起作用,否则我不会执行后者。
希望对某些人有所帮助。
右键单击您的数据库,选择任务->生成脚本
选择要还原的内容,或者默认选择完整的数据库。
现在点击下一步-> 点击高级选项,并选择“Script for Server Version”到您想要还原的ssms版本,如2008或2008 R2或其他版本。
同时,将“要脚本化的数据类型”选为“架构和数据”。
最后,在目标ssms上执行此 .sql 文件,并在第一行中更改数据库名称使用数据库。
如果数据库不存在,则创建一个。 如果在执行脚本时出现错误,请从alter关键字开始执行脚本,一直执行到底部。
致:Killercam
感谢您提供的解决方案。我尝试了第一种方法一个小时,但对我没有用。
我使用了生成脚本方法将数据从 SQL Server 2012 移动到 SQL Server 2008 R2,步骤如下:
在 2012 年的 SQL Management Studio 中
对我有用。
您无法将SQL Server的高版本还原为低版本。您唯一的选择是通过SSIS、BCP、链接服务器或脚本化数据,将数据库脚本化并传输数据。
这里有另一个选项,对我很有用:https://dba.stackexchange.com/a/44340
我使用了选项B。这不是我的想法,所以所有的功劳归原作者所有。我在这里也加上它,因为有时候链接不能使用,建议把完整的故事备好。
给大家一个提示:如果有任何模式不兼容的问题,请先解决。然后导入数据就会变得轻松。
选项A:使用Generate script选项以兼容模式脚本输出数据库:
注意:如果你将带有模式和数据的数据库脚本输出,根据你的数据大小,脚本将非常庞大,SSMS、sqlcmd或osql无法处理(可能也达到GB级别)。
选项B:
首先,先脚本化所有表,包括所有索引、FK等,并在目标数据库中创建空表——选择只有SCHEMA(没有数据)的选项。
使用BCP插入数据
I. 通过下面的脚本将数据BCP输出。将SSMS设置为文本模式,并复制下面脚本生成的输出到一个批处理文件中。
-- save below output in a bat file by executing below in SSMS in TEXT mode
-- clean up: create a bat file with this command --> del D:\BCP\*.dat
select '"C:\Program Files\Microsoft SQL Server\100\Tools\Binn\bcp.exe" ' /* path to BCP.exe */
+ QUOTENAME(DB_NAME())+ '.' /* Current Database */
+ QUOTENAME(SCHEMA_NAME(SCHEMA_ID))+'.'
+ QUOTENAME(name)
+ ' out D:\BCP\' /* Path where BCP out files will be stored */
+ REPLACE(SCHEMA_NAME(schema_id),' ','') + '_'
+ REPLACE(name,' ','')
+ '.dat -T -E -SServerName\Instance -n' /* ServerName, -E will take care of Identity, -n is for Native Format */
from sys.tables
where is_ms_shipped = 0 and name <> 'sysdiagrams' /* sysdiagrams is classified my MS as UserTable and we dont want it */
/*and schema_name(schema_id) <> 'unwantedschema' */ /* Optional to exclude any schema */
order by schema_name(schema_id)
二. 运行批处理文件,它将在您指定的文件夹中生成.dat文件。
三. 在目标服务器上再次使用SSMS以文本模式运行以下脚本。
--- Execute this on the destination server.database from SSMS.
--- Make sure the change the @Destdbname and the bcp out path as per your environment.
declare @Destdbname sysname
set @Destdbname = 'destinationDB' /* Destination Database Name where you want to Bulk Insert in */
select 'BULK INSERT '
/*Remember Tables must be present on destination database */
+ QUOTENAME(@Destdbname) + '.'
+ QUOTENAME(SCHEMA_NAME(SCHEMA_ID))
+ '.' + QUOTENAME(name)
+ ' from ''D:\BCP\' /* Change here for bcp out path */
+ REPLACE(SCHEMA_NAME(schema_id), ' ', '') + '_' + REPLACE(name, ' ', '')
+ '.dat'' with ( KEEPIDENTITY, DATAFILETYPE = ''native'', TABLOCK )'
+ char(10)
+ 'print ''Bulk insert for ' + REPLACE(SCHEMA_NAME(schema_id), ' ', '') + '_' + REPLACE(name, ' ', '') + ' is done... '''
+ char(10) + 'go'
from sys.tables
where is_ms_shipped = 0
and name <> 'sysdiagrams' /* sysdiagrams is classified my MS as UserTable and we dont want it */
--and schema_name(schema_id) <> 'unwantedschema' /* Optional to exclude any schema */
order by schema_name(schema_id)
IV. 运行输出使用 SSMS 将数据插入回表中。
这是非常快速的 BCP 方法,因为它使用本地模式。
2012
恢复到 2008
。你可以使用像 red-gate SQL compare
这样的工具来复制模式等内容(前提是没有使用任何 2012 特定的内容)。如果你还需要复制数据,可以使用他们的 Data Compare
工具,我想你可以获得14天的免费试用。降级 SQL Server 数据库的唯一内置方法是比较困难的:将整个数据库、模式和数据脚本化,然后在目标服务器上执行脚本。
虽然可行,但往往比较繁琐。
正如已经提到的,您不能使用“备份”和“还原”功能从SQL Server 2012数据库转移到SQL Server 2008数据库。我编写的一个程序,SQL Server Scripter,可以连接到SQL Server数据库并脚本化数据库、其模式和数据。它可以从BitBucket进行git克隆,并使用Visual Studio 2010或更高版本进行编译(如果是较新版本,请打开.csproj
文件)。
合并复制。您可以从发布服务器(2008)创建订阅服务器(2008)。在数据库完全同步之后,删除订阅和发布。