我发现BCP比一些工具更有效,可以将数据获取到早期版本的SQL Server中,以及从RDS中提取数据。(感谢@ivan_posdeev。)
我首先通过右键单击SQL Server Management Studio中的数据库,“任务”,“生成脚本”来生成架构。选中所有对象,在高级对象中确保要编写脚本(统计信息,索引等),如果目标数据库名称不同,则取消选中“ USE database”,设置与目标数据库版本的兼容性,并生成一个创建您的架构的文件。创建你的目的地的数据库,并在其上运行此文件(使用osql
,sqlcmd
或GUI)。
要移动数据,请在源数据库上运行以下查询两次,首先注释第二列以生成提取数据的批处理文件,然后注释第一列以生成要在目标上运行的导入批处理文件。(您需要添加源服务器和目标服务器,实例名称,输出和输入文件目录,用户名和密码。要使用集成安全性,请仅将和选项替换为。)-U
-P
-T
这支持Unicode,如果不需要的话,-N
请将两个语句中的开关都更改为-n
。
SELECT
'bcp SOURCEDATABASE.' + s.Name + '.' + t.NAME + ' out d:\dbdump\' + s.Name + '.' + t.NAME + '.dat -N -S SOURCESERVER\INSTANCE -UUSER -PPASSWORD'
-- 'bcp DESTINATIONDATASE.' + s.Name + '.' + t.NAME + ' in d:\dbdump\' + s.Name + '.' + t.NAME + '.dat -N -S DESTINATIONSERVER\INSTANCE -UUSER -PPASSWORD -E -h TABLOCK -b 1000 -e d:\dbdump\' + s.Name + '.' + t.NAME + '.ERRORS.dat'
FROM
sys.tables t
INNER JOIN
sys.indexes i ON t.OBJECT_ID = i.object_id
LEFT OUTER JOIN
sys.schemas s ON t.schema_id = s.schema_id
ORDER BY
s.Name, t.NAME
运行名为schema.tablename.ERRORS.dat的检查文件后,它将包含所有失败的行,如果没有,则为空。
有关BCP的MSDN参考,此处更友好地介绍了BCP选项。
我发现它比生成脚本和我尝试过的任何工具都优越得多。它还在RDS数据库(不允许备份)上运行。生成的数据文件仅占SQL脚本大小的30%,运行它们仅需花费一小部分时间,并且可靠性更高。(由SQL Server生成的用于脚本化数据的脚本始终会跳动,有时可以预见,有时却不兼容,所生成的SQL与2008R2不兼容(例如,used nvarchar(0)
,通常由于没有明显的原因而没有完成,等等。BCP还复制了任何违反约束的行为,例如参照完整性。)。