从 SQL Server 2008 降级到 2005

Sev*_*vki 32 sql-server-2005 sql-server-2008

使用 SQL 2008 构建的数据库文件与 2005 不兼容。有解决办法吗?

Jer*_*hka 16

您可以将数据从一个 SQL Server 实例 BCP 到另一个实例。这将是将数据从一个版本复制到另一个版本的最快方法。根据数据量,可能需要很长时间。

  • 根据数据量,几乎总是需要很长时间 (2认同)
  • BCP 的优点是它比使用脚本数据更快。是的,它很慢,但比许多替代方案都要快。 (2认同)

Bra*_*adC 16

不需要第 3 方工具。SQL Server 2008 Management Studio 为我们提供了一个非常强大的工具来向下转换数据库,因为它们向“脚本数据库”向导添加了“脚本数据”选项。

只需右键单击 SQL2008 SSMS 中的 DB,然后转到“任务”,然后“生成脚本”

完成向导,确保在表/视图选项下为“脚本数据”选择“真”。选择所有对象,然后运行它在 2005 服务器上创建的脚本。(请记住,创建的脚本可能是巨大的,如果原来的数据库是非常大的!)

请注意,您甚至可以针对 SQL2005 服务器运行该向导,将 SQL2005 数据库下转换为 SQL2000(当然,您需要在工作站上安装 2008 工具)。

  • 无意冒犯,但如果数据库很大,这不能成为解决方案。在具有几百万行的任何表上尝试该技术(并将 varchar(max) 视为单列的数据类型),如果 Management Studio 能够打开并解析此文件,您会很高兴,但我很高兴确定它不会打开,它会崩溃。抱歉,但这不是解决此问题的方法,除非数据库非常小。 (4认同)
  • 当然,如果数据库太大,只需编写数据库结构的脚本,然后使用您喜欢的方法(SSIS、BCP、导入向导)推送数据。 (3认同)

Dav*_*ett 15

据我所知,没有直接的方法可以将数据库从 2008 年的格式降级到 2005 年的格式。

我过去这样做的方式(实际上是使用旧版本的 SQL 服务器,但过程是相同的)是:

  1. 如果尚未在 SQL2008 实例上还原数据库
  2. 在 SQL2005 实例上构建一个具有正确结构(表、索引、约束、视图、过程、触发器等)的空数据库。希望您可以从现有的构建过程和/或源代码中执行此操作,但如果不能,您可以使用 SQL Server 管理器为 2005 数据库中的所有内容创建脚本,并在 2008 实例中的空白数据库上运行结果。
  3. 确保两个实例可以相互看到(即,如果实例位于不同的机器上,则没有防火墙阻止连接)并使用sp_addlinkedserver将它们链接起来。
  4. 将所有数据从一个数据库复制到另一个数据库。如果触发器中没有外键约束和类似问题需要担心,您只需将数据库链接在一起并通过表列表(从 sys.objects 中选择它们)并运行
    INSERT destinationserver.destinationdb.schema.table SELECT * FROM sourcedb.schema.table
    (或者INSERT schema.table SELECT * FROM sourceserver.sourcedb.schema.table如果您已将实例链接在一起) )
    每个表。如果您确实有强制执行约束和触发器的表间一致性,您当然需要更聪明地处理这些操作的顺序,特别是如果您有循环约束,例如具有基于自身的约束的表(一个持有层次结构)数据,作为一个可能的例子)。

首先复制数据并在第 3 步之后添加所有其他结构(索引、过程、触发器等)可能更有效。这避免了由约束和触发器引起的行插入排序问题,并在第 3 步构建索引。理论上 end 应该比在添加所有数据时构建它们更快 - 尽管如果您的表上有任何聚集索引,请在添加数据之前创建这些索引,因为在事实之后创建它们不会更快。

当然,这一切都假设您的对象都没有使用 SQL 2008 特定功能 - 如果它们使用,您将希望在重建模式时出现错误时找出并修复这些问题。如果您的任何代码依赖于官方未定义的行为,而这些行为恰好在 SQL Server 版本之间有所不同,那么您可能会遇到一些更微妙和难以捉摸的错误,以便日后追查和解决。


Cod*_*awk 7

我遇到了类似的情况,并使用数据库发布向导从 SQL Server 2008 数据库为 SQL Server 2005 编写架构和数据脚本。

SQL Server 托管 Web 服务(和工具包)

数据库发布向导