我们的用户希望从生产环境中刷新 QA 数据库,但希望使用两个表(我们称它们为 T1 和 T2)来保留原始 QA 数据。所以我将两个表从 QA (DB1) 复制到一个临时 QA 数据库 (DB2)。然后从生产中刷新 DB1。刷新后,我想将 T1 和 T2 数据从 DB2 覆盖到 DB1,以便它可以包含刷新前的 QA 值。
我做了以下事情:
利用
select * INTO D1.dbo.T1 FROM D2.dbo.T1
然后从 prod 刷新 D1
然后使用以下步骤截断 T1:
SELECT COUNT(*) AS BeforeTruncateCount FROM T1; GO TRUNCATE TABLE T1; GO SELECT COUNT(*) AS AfterTruncateCount FROM T1; GO
现在,当我返回将数据从 D2.T1 复制到 D1.T1 时,我收到错误消息,即数据库中已经存在一个名为 T1 的对象。
我应该放下桌子并复制吗?
或者整个过程有没有更好的方法?
最好是使用 SSIS(数据导入/导出)来做到这一点。它具有将选定表从源传输到目标的功能。或者,您甚至可以保存包,以便将来/重复传输重新使用它。
编辑:为清楚起见,添加更多屏幕截图。
结合@Kin 和@DavidSpillett 的答案。
首先是一个假设。DB1 和 DB2 在同一个实例上。听起来确实是这样,但陈述显而易见的事情永远不会有坏处(特别是因为我以前认为显而易见的事情是错误的。)
鉴于此,如果数据很大,比如数百万行,则使用 SSIS 包。这具有您将要使用的一项特定功能。您可以指定批量大小。这样你的交易规模会更小。SSIS 包的缺点是它为您的流程增加了一定程度的复杂性。它不是很大,但如果您使用的是较小的桌子,则不需要它。
这将我们引向另一个选择。但是,如果数据在几十万或更小范围内,则使用这样的代码。
最后但并非最不重要的一点是,如果它在边境的某个地方,那么我会尝试两者,看看什么最适合你。
注意:您也可以考虑不使用 a
SELECT *
而是INSERT INTO
指定一个字段列表。该结构看起来像这样
具有 SQL Server 语法的 IIRC
SELECT <stuff> INTO <target> FROM ...
始终假定您要从头开始创建目标表。当表已经存在时尝试INSERT <target> SELECT <stuff> FROM ...
。