Como copiar uma linha de uma tabela do SQL Server para outra

91

Tenho duas tabelas idênticas e preciso copiar linhas de uma tabela para outra. Qual o melhor jeito pra fazer isso? (Preciso copiar programaticamente apenas algumas linhas, não preciso usar o utilitário de cópia em massa).

rp.
fonte

Respostas:

120

Enquanto não houver colunas de identidade, você pode apenas

INSERT INTO TableNew
SELECT * FROM TableOld
WHERE [Conditions]
Scott Nichols
fonte
23
Tenha cuidado com esta sintaxe, pois ela não funcionará se a Tabela2 tiver uma coluna de identidade e será interrompida no futuro se a Tabela1 for alterada sem que a Tabela2 mude em sincronia (queimou antes). Esta solução pode ser perfeita para o seu caso, basta estar ciente dessas considerações.
Michael Haren
11
Você pode usar SET IDENTITY_INSERT < table > ON(e SET IDENTITY_INSERT < table > OFF) para desabilitar temporariamente a coluna de identidade na tabela que está tentando inserir. Trabalhou para mim tentando restaurar alguns registros ausentes no meio do conjunto de dados.
nickb
1
e se a chave primária na tabela1 existir na tabela2 como uma chave estrangeira? Eu tenho a mesma coisa, e não sei o que fazer .. na tabela2 id a chave estrangeira AS "Technology_idTechnology" e na tabela 1, está lá como "idTechnology" quero copiar todas as entradas da tabela1 para tabela2, quando o idTecnologia coincide em ambas as tabelas ..
ZelelB 24/03/15
71

Sintaxe alternativa:

INSERT tbl (Col1, Col2, ..., ColN)
  SELECT Col1, Col2, ..., ColN
  FROM Tbl2
  WHERE ...

A consulta selecionada pode (é claro) incluir expressões, declarações case, constantes / literais, etc.

Michael Haren
fonte
2
Isso é ótimo quando as tabelas diferem ligeiramente. Tenho algumas colunas extras em minha segunda tabela e a resposta aceita não funciona com MSSQL, pois elas precisam ser idênticas.
Tony M
39

A resposta de Jarrett cria uma nova mesa.

A resposta de Scott é inserida em uma tabela existente com a mesma estrutura.

Você também pode inserir em uma tabela com estrutura diferente:

INSERT Table2
(columnX, columnY)
SELECT column1, column2 FROM Table1
WHERE [Conditions]
ScottStonehouse
fonte
6
@ScottStonehouse: se você coletar todas as outras respostas nesta resposta como fez, mas com código (tornando-a abrangente), você definitivamente se tornará a melhor resposta.
Michael Haren
6
INSERT INTO DestTable
SELECT * FROM SourceTable
WHERE ... 

funciona em SQL Server

Kaniu
fonte
2
Isso funciona apenas quando DestTable não existe. Você obterá um erro se DestTable for criado antes desta consulta.
Um desenvolvedor da web de
2
Na verdade, ele falhará se a tabela de destino não existir. Isso pode causar erros se a DestTable existente não estiver vazia.
Kaniu
5
SELECT * INTO < new_table > FROM < existing_table > WHERE < clause >
Jarrett Meyer
fonte
1
Existe alguma maneira de fazer isso se essas duas tabelas estiverem em bancos de dados diff em sql-server.
Naresh
9
Certo! Apenas qualifique totalmente o banco de dados. [servername]. [schema]. [table]. Por exemploSELECT * INTO [SQLTEST].[dbo].[EMPLOYEES] FROM [SQLPROD].[dbo].[EMPLOYEES]
Jarrett Meyer
4
Isso cria uma nova tabela, que não é o que o OP está pedindo.
Conrad