如何将远程 SQL Server Express 数据库的部分副本复制到本地 SQL Server Express 数据库?
Posted
技术标签:
【中文标题】如何将远程 SQL Server Express 数据库的部分副本复制到本地 SQL Server Express 数据库?【英文标题】:How to do a partial copy of a remote SQL Server Express database to a local SQL Server Express database? 【发布时间】:2010-06-22 12:01:29 【问题描述】:我需要从远程 SQL Server (2005/2008 Express Edition) 创建数据库的部分副本并将其存储在本地 SQL Server (2005/2008 Express Edition) 数据库中。本地副本将具有相同的模式定义,但仅包含来自远程数据库的部分数据。
本地数据库必须使用 C# 代码中的参数指定一个唯一名称,类似于
TodaysDate_SerialNumber_MachineNumber_DatabaseName
e.g. 20100622_1_3_DatabaseName
(不要纠结命名方案,还没有决定。)
我正在使用 VS2010 在 .net 3.5 上使用 C#。
到目前为止,我的想法是从 C# 代码在本地 SQL 服务器上执行数据库的创建脚本,然后将数据从远程数据库复制到本地数据库,根据我实际需要的内容进行过滤。操作必须从 C# 代码开始,但不一定是所有 C# 代码。但我还没有决定。您认为做我想做的事情的最佳选择是什么?
(顺便说一句,如果我不清楚,请告诉我,我会尝试用更多信息更新问题。)
【问题讨论】:
【参考方案1】:SqlBulkCopy 可能是您最好的选择,如果您完全在代码中执行此操作。
您将与每个数据库建立 sql 连接,然后在源数据库上运行一条 select 语句,该语句会将行插入到目标数据库/表中。
【讨论】:
在没有彻底调查的情况下,我最喜欢你的建议,这是迄今为止我见过的 3 个建议。明天我会做一些研究和一些实验,然后我会标记对我最有用的答案。 在被转移后,我现在解决了这个问题。 SqlBulkCopy 对我来说效果很好。我查询数据库中的所有表,然后为每个表查询列,然后生成一个 Select 语句,从表中选择所有列。然后,我创建了一个 SqlDataReader,将其提供给 SqlBulkCopy 对象,瞧!我使用它来将数据库中的数据精确复制到另一个具有相同表和模式的数据库中。我使用 SqlBulkCopyOptions.KeepIdentity 来确保我的 FK 关系保持有效。所以感谢@PaulG 建议 SqlBulkCopy 类。 =)【参考方案2】:这个问题的答案真的取决于你最喜欢做什么。
我可能会在本地 SQL Express 上设置一个链接服务器并编写一个 SQL 脚本来完成整个工作。它可以使用 RAISERROR ... WITH NOWAIT
向 C# 应用程序报告进度,并且可以通过设置 SqlInfoMessageEventHandler 来异步处理这些消息
【讨论】:
我最喜欢使用 C#,尽管我应该能够按照您的建议创建 SQL 脚本。我会做一些测试,看看什么表现最好。不过,我没有使用链接服务器的经验,所以我必须研究一下。你知道任何解释链接服务器的好文章吗?还有一个重要的问题:链接服务器是否可以在两个 SQL Server Express 实例之间工作? @Sub-Star 是的,链接服务器在 SQL Express 上工作。我可以看到 C# 和 SQL 解决方案的优缺点。 C# 的效率可能会稍低一些,因为您的应用程序正在编排每个单独的步骤,但在 C# 中可能会更容易处理错误等事情。【参考方案3】:也许您可以创建数据库的备份,将其下载到本地机器,在那里创建一个新的空数据库,然后使用“覆盖”选项将备份恢复到空数据库。之后,您可以删除那些您不想“复制”的记录。
您可以使用 Microsoft SQL Management Studio 创建备份和恢复脚本。
【讨论】:
以上是关于如何将远程 SQL Server Express 数据库的部分副本复制到本地 SQL Server Express 数据库?的主要内容,如果未能解决你的问题,请参考以下文章
如何将所有数据库(快速)自 sql server 2008 express 传递到 sql server 2008 R2(无 express)
如何从 C# 代码将 SQL Server CE 迁移到 SQL Server 2012 Express
SQL Express/SQL Server 需要哪些服务?