sobrescrever tabela com dados de outra tabela - SQL

9

Nossos usuários desejam atualizar um banco de dados de controle de qualidade da produção, mas desejam duas tabelas (vamos chamá-las de T1 e T2) para manter os dados originais do controle de qualidade. Então, copiei duas tabelas do controle de qualidade (DB1) para um banco de dados temporário de controle de qualidade (DB2). DB1 atualizado da produção. Após a atualização, desejo sobrescrever os dados T1 e T2 do DB2 para o DB1 para que eles possam conter valores de QA de pré-atualização.

Eu fiz o seguinte:

  1. Usar

    select * 
    INTO D1.dbo.T1
    FROM D2.dbo.T1
    
  2. Então D1 atualizado a partir de prod

  3. Em seguida, trunque T1 com a seguinte etapa:

    SELECT COUNT(*) AS BeforeTruncateCount
    FROM T1;
    GO
    TRUNCATE TABLE T1;
    GO
    SELECT COUNT(*) AS AfterTruncateCount
    FROM T1;
    GO
    
  4. Agora, quando volto a copiar dados de D2.T1 para D1.T1, recebo o erro de que já existe um objeto chamado T1 no banco de dados.

Devo largar a mesa e copiar?

Ou existe algum método melhor para todo o procedimento?

Rizwan
fonte

Respostas:

6

Para combinar as respostas de @Kin e @DavidSpillett.

Primeiro uma suposição. DB1 e DB2 estão na mesma instância. Certamente parece que são, mas nunca é demais afirmar o óbvio (principalmente porque eu errei com o que achava óbvio antes).

Dado que, se os dados forem grandes, digamos vários milhões de linhas, use um pacote SSIS. Isso tem um recurso específico que você deseja usar. Você pode especificar um tamanho de lote. Dessa forma, o tamanho da sua transação será menor. A desvantagem do pacote SSIS é que ele adiciona um nível de complexidade ao seu processo. Não é grande, mas se você estiver trabalhando com uma mesa menor, não precisará dela.

O que nos leva à outra opção. Se, no entanto, os dados estiverem na faixa de várias centenas de milhares ou menos, use um código como este.

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

E por último mas não menos importante, se estiver em algum lugar na fronteira, eu tentaria os dois e veria o que funciona melhor para você.

NOTA: Você também pode considerar não usar um SELECT *na INSERT INTOe, em vez disso, especificar uma lista de campos.

Essa estrutura ficaria assim

INSERT INTO D1.dbo.T1 (Field1, Field2)
SELECT Field1, Field2
FROM D2.dbo.T1;
Kenneth Fisher
fonte
Obrigado pela informação. Sim, a tabela possui apenas 7800 linhas, portanto, é bastante pequena e na mesma instância. Eu tentei usar INSERT INTO (sem selecionar) e funcionou perfeitamente. Obrigado por compartilhar isso. Também testei com Importar dados com SSMS. Isso funcionou muito bem também.
Rizwan
11
Esteja ciente de que será necessário especificar uma lista de campos (e não usá-los *) se houver um campo de indentação na tabela - esses valores não podem ser apenas "copiados".
Conrad
6

O IIRC com a SELECT <stuff> INTO <target> FROM ...sintaxe do SQL Server sempre pressupõe que você deseja criar a tabela de destino do zero. Quando a tabela já existir, tente INSERT <target> SELECT <stuff> FROM ....

David Spillett
fonte
5
Além disso, a resposta de David também é uma rota melhor do que uma DROP e SELECT INTO ao mover os dados de volta para D1, porque se você soltasse as tabelas D1, perderia qualquer objeto filho (por exemplo, chaves estrangeiras, chaves primárias, gatilhos etc.) )
Delux
2
Eu concordo com o @Delux. Outra coisa importante que você perderá é permissões explícitas. Se um usuário tiver permissões específicas para essa tabela (em vez de dizer db_datareader), se você soltar a tabela, perderá essas permissões.
30913 Kenneth Fisher
Esta é uma ótima dica. Eu não entendi as ramificações do DROP até agora. Obrigado!
Rizwan
6

O melhor é usar o SSIS (importação / exportação de dados) para fazer isso. Ele tem a funcionalidade de transferir apenas as tabelas selecionadas da origem para o destino. Opcionalmente, você pode até salvar o pacote para que possa ser reutilizado para transferências futuras / repetidas.

EDIT: Adicionando mais capturas de tela para maior clareza.

insira a descrição da imagem aqui

insira a descrição da imagem aqui

insira a descrição da imagem aqui

insira a descrição da imagem aqui

insira a descrição da imagem aqui

Kin Shah
fonte
wow .. obrigado por grandes screenshots .. eles são uma grande ajuda
Rizwan
Ótima solução, boas capturas de tela funcionam!
Mayer Spitzer