用另一个表中的数据覆盖表-SQL


9

我们的用户想要从生产中刷新QA数据库,但希望有两个表(分别称为T1和T2)保留原始QA数据。因此,我将两个表从QA(DB1)复制到临时QA数据库(DB2)。然后从生产中刷新DB1。刷新之后,我想将T1和T2数据从DB2覆盖到DB1,以便它可以包含预刷新的QA值。

我已经完成以下工作:

  1. 采用

    select * 
    INTO D1.dbo.T1
    FROM D2.dbo.T1
  2. 然后从产品刷新D1

  3. 然后使用以下步骤截断T1:

    SELECT COUNT(*) AS BeforeTruncateCount
    FROM T1;
    GO
    TRUNCATE TABLE T1;
    GO
    SELECT COUNT(*) AS AfterTruncateCount
    FROM T1;
    GO
  4. 现在,当我返回将数据从D2.T1复制到D1.T1时,我得到一个错误,即数据库中已经存在一个名为T1的对象。

我应该放下桌子复制吗?

还是整个过程中有更好的方法?

Answers:


6

结合@Kin和@DavidSpillett的答案。

首先是一个假设。DB1和DB2在同一实例上。听起来确实像是,但是陈述显而易见的事实并没有什么害处(特别是因为我以前对以前认为明显的观点有误。)

鉴于此,如果数据很大,则说几百万行,然后使用SSIS包。它具有您要使用的一项特定功能。您可以指定批次大小。这样,您的交易规模将变小。SSIS程序包的不利之处在于它增加了过程的复杂性。它不是一个大表,但是如果您使用较小的表,则不需要它。

这导致我们转向另一种选择。但是,如果数据在几十万或更小范围内,则使用这样的代码。

USE D1;
GO
TRUNCATE TABLE dbo.T1;
GO
INSERT INTO D1.dbo.T1
SELECT * 
FROM D2.dbo.T1;
GO

最后但并非最不重要的一点是,如果它在寄宿生中某处,那么我将同时尝试这两种方法,然后看看哪种方法最适合您。

注意:您也可以考虑不使用SELECT *INSERT INTO,而是指定一个字段列表。

该结构看起来像这样

INSERT INTO D1.dbo.T1 (Field1, Field2)
SELECT Field1, Field2
FROM D2.dbo.T1;

谢谢(你的)信息。是的,该表只有7800行,因此在同一实例上非常小。我试过使用INSERT INTO(不选择),它运行良好。多谢分享。我还用SSMS进行了导入数据测试。那也很棒。
Rizwan

1
请注意,*如果表中有一个恒等字段,则需要指定一个字段列表(而不要使用),这些值不能只是“复制”。
康拉德

6

具有SELECT <stuff> INTO <target> FROM ...语法的IIRC SQL Server始终假定您要从头开始创建目标表。如果表已经存在,请尝试INSERT <target> SELECT <stuff> FROM ...


5
此外,将数据移回D1时,David的答案也比DROP和SELECT INTO更好,因为如果删除D1表,则会丢失任何子对象(即外键,主键,触发器等)。 )
豪华(Delux

2
我同意@Delux。您将失去的另一重要内容是显式权限。如果用户具有特定于该表的权限(而不是说db_datareader),则如果删除该表,则会丢失这些权限。
肯尼斯·费舍尔

那是一个很好的提示。到目前为止,我还不了解DROP的影响。谢谢!
Rizwan

6

最好是使用SSIS(数据导入/导出)来执行此操作。它具有仅将选定表从源转移到目标的功能。(可选)您甚至可以保存该程序包,以便可以将其重新用于以后的/重复的传输。

编辑:为清晰起见添加了更多屏幕截图。

在此处输入图片说明

在此处输入图片说明

在此处输入图片说明

在此处输入图片说明

在此处输入图片说明


哇..感谢您提供的出色屏幕截图..它们提供了很大的帮助
Rizwan 2013年

很棒的解决方案,不错的屏幕截图!
Mayer Spitzer
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.