如何将架构和一些数据从SQLServer复制到另一个实例?

如何将架构和一些数据从SQLServer复制到另一个实例?,sql,sql-server,sql-server-2005,Sql,Sql Server,Sql Server 2005,我的产品使用SQL Server数据库—每个客户机在自己的intranet上都有自己的部署实例。db有大约200个表。其中大多数是只有几行的配置表,但也有一些事务数据表可能有几百万行。通常我需要解决客户的配置问题,所以我需要他们的数据库副本,以便在我的开发系统上本地使用。。。但是,由于交易数据的原因,它可能非常大,这使得客户很难向我发送备份。我需要一种方法来备份/复制/导出除大型表以外的所有内容 理想情况下,大型表实际上属于一个单独的数据库目录,这样客户就可以将其“数据”与“配置”分开备份。但是

我的产品使用SQL Server数据库—每个客户机在自己的intranet上都有自己的部署实例。db有大约200个表。其中大多数是只有几行的配置表,但也有一些事务数据表可能有几百万行。通常我需要解决客户的配置问题,所以我需要他们的数据库副本,以便在我的开发系统上本地使用。。。但是,由于交易数据的原因,它可能非常大,这使得客户很难向我发送备份。我需要一种方法来备份/复制/导出除大型表以外的所有内容

理想情况下,大型表实际上属于一个单独的数据库目录,这样客户就可以将其“数据”与“配置”分开备份。但是,我没有权限进行这种类型的更改,因此我正在寻找一种好方法,只导出或复制配置部分,而不必复制整个内容

目前我有一个快速脏的.NET应用程序,它使用SQL适配器和数据集从所有表中盲目地选择*,除了我想忽略的表,将其转储到XML文件中(这是我可怜的人的导出功能)。我有一个配套的应用程序,我可以在本地使用它将XML加载回数据集,然后使用SQLBulkCopy将其加载到我的开发数据库中。我不得不做一些技巧来禁用约束等等,但我成功了。这会获取数据,但不会获取模式。。。。理想情况下,我希望有一种方法来获得模式。这是一种暴力手段,我相信一定有更简单的方法。对更好的方法有什么建议吗

该解决方案需要自动化,因为我所处理的最终用户通常很少有IT支持


(SQL 2005及更高版本)

能否直接从SSM生成脚本

  • 右键单击数据库
  • 选择任务->生成脚本
  • (如果出现介绍屏幕,请单击下一步)
  • 选择“选择特定的数据库对象”
  • 选择要为其生成脚本的对象(表、存储过程等)
  • 单击“下一步”,然后指定输出文件名
  • 单击Finish以生成脚本
  • 这将只生成模式。如果还想生成数据生成脚本,请在步骤6)中单击“高级”按钮并向下滚动到“要编写脚本的数据类型”,并将其从“仅模式”更改为“仅数据”或“模式和数据”

    在您的情况下,您可以对所有小配置表执行“Schema and data”,然后对不想导出数据的大表执行“Schema only”

    我知道这不是完全自动化的,但是它非常接近。如果您想进一步了解自动化,请查看此线程。不确定这是否适用于SQL 2005:


    在红门,我们有一个名为SQL Packager的工具,它有一个命令行,可以自动执行此任务。这在引擎罩下使用SQL比较和SQL数据比较引擎。我很想得到你的反馈,看看这是否满足你的用例


    我解决了它如下。我创建了一个自定义winform应用程序以导出其数据:

  • 使用SMO(传输类)将整个架构脚本化为.sql文件
  • 使用:select*from循环遍历所有指定的表(实际上我只是列出了要忽略的大型增长表,并处理所有其他表)
  • 将记录捕获到DataTable对象中,并将其转储到.xml文件中
  • 把整个文件夹拉上拉链寄还给我
  • 我有一个自定义winform应用程序,我在我的开发系统上本地使用它来导入数据:

  • 创建一个空数据库
  • 运行.sql文件以生成架构
  • 禁用所有表上的所有约束(使用sp_foreachtable)
  • 循环遍历所有.xml文件,并使用SqlBulkCopy对象大容量导入它们
  • 重新启用所有约束(使用sp_foreachtable)
  • 这种方法适用于我的数据库,但对于某些数据库设计,我不一定建议这样做。在我的例子中,有许多“小”配置表,只有少数几个“大”表之间的关系最小,因此我可以很容易地忽略大的配置表。如果有更复杂的关系,这可能不是一个好的解决方案

    到目前为止似乎效果很好。我希望找到一种不用编写自定义代码的好方法来实现这一点,但我只花了几个小时的开发时间

    仅供参考,我几乎可以使用sqlpubwiz实现它,但是脚本数据的选项是要么全部,要么什么都没有。。。您不能忽略特定的表。。。这是我的应用程序的一个交易破坏者。 SMO中的Transfer对象是一个非常有用的类—它只需要几行代码就可以按照正确的创建顺序编写整个数据库架构(包括所有依赖项)的脚本,从而从头开始重新创建数据库


    因为我们过去也有类似的问题,所以只需几句评论

    SSMS中的“生成脚本”选项非常适用于小型数据库,在这些数据库中,您可以手动重新排序各个脚本并避免依赖性问题。不知道为什么这么多人建议使用这个有依赖性问题的功能

    对于大型数据库,唯一可行的解决方案是您自己创建或使用第三方工具

    我们最终使用了这个。SQL Packager在我们评估时工作得更好一些,但我们设法基本上免费获得了另一个工具


    无论如何,希望这有帮助,即使这是一个迟来的回答/评论…

    谢谢你的回复。我将研究脚本的自动化。此外,我还手动尝试过,但操作顺序有问题(例如,它试图在创建基础表之前创建视图)。。。似乎它没有遵循依赖顺序。我要挖进去看看能找到什么。