Inserir todos os valores de uma tabela em outra tabela no SQL

128

Estou tentando inserir todos os valores de uma tabela em outra. Mas a instrução insert aceita valores, mas eu gostaria que ele aceitasse um select * da initial_Table. Isso é possível?

Vinod
fonte

Respostas:

262

A instrução insert realmente tem uma sintaxe para fazer exatamente isso. É muito mais fácil se você especificar os nomes das colunas em vez de selecionar "*":

INSERT INTO new_table (Foo, Bar, Fizz, Buzz)
SELECT Foo, Bar, Fizz, Buzz
FROM initial_table
-- optionally WHERE ...

É melhor esclarecer isso porque, por algum motivo, este post está recebendo alguns votos negativos.

A sintaxe INSERT INTO ... SELECT FROM é para quando a tabela que você está inserindo ("new_table" no meu exemplo acima) já existe. Como já foi dito, a sintaxe SELECT ... INTO é para quando você deseja criar a nova tabela como parte do comando.

Você não especificou se a nova tabela precisa ser criada como parte do comando, portanto, INSERT INTO ... SELECT FROM deve ficar bem se sua tabela de destino já existir.

Matt Hamilton
fonte
3
Wha--? Alguém quer me deixar um comentário explicando por que este post está gerando votos negativos? Não vejo nada na pergunta dos OPs que especifique que a nova tabela deve ser criada como parte da consulta.
Matt Hamilton
Como isso lida com violações de restrição de integridade? Por exemplo, se um único for duplicado, ele interrompe a consulta ou apenas pula essa entrada específica?
Martin Dale Lyness
Acredito que isso gerará um erro e reverterá a transação, o que significa que nada é copiado. Vale a pena testar embora.
Matt Hamilton
25

Tente o seguinte:

INSERT INTO newTable SELECT * FROM initial_Table
FibreCode
fonte
2
Não funciona ao usar estrelas quando temos coluna de identidade
Mohsen Tavoosi Última resposta:
Para este cenário com identidade, adicione SET IDENTITY_INSERT table_name ON primeiro e o mesmo com off no final para inserir os valores de identidade.
Juan Juan
13

Você pode inserir usando uma subconsulta da seguinte maneira:

INSERT INTO new_table (columns....)
SELECT columns....
FROM initial_table where column=value
sornalingam
fonte
8

A partir daqui:

SELECT *
INTO new_table_name [IN externaldatabase] 
FROM old_tablename
Otávio Décio
fonte
4

Existe uma maneira mais fácil de você não precisar digitar nenhum código (ideal para testes ou atualizações únicas):

Passo 1

  • Clique com o botão direito do mouse na tabela no explorer e selecione "Editar as 100 principais linhas";

Passo 2

  • Em seguida, você pode selecionar as linhas que deseja ( Ctrl + Clique ou Ctrl + A ) e clicar com o botão direito e Copiar ( Observação : se você deseja adicionar uma condição " where ", clique com o botão direito do mouse em Grade -> Painel -> SQL agora você pode editar a Consulta e adicionar a condição WHERE, depois clique com o botão direito novamente -> Executar SQL; suas linhas necessárias estarão disponíveis para seleção na parte inferior)

etapa 3

  • Siga a Etapa 1 para a tabela de destino.

Passo 4

  • Agora vá para o final da grade e a última linha terá um asterisco (*) na primeira coluna (Esta linha é para adicionar uma nova entrada). Clique nele para selecionar a linha inteira e depois COLAR ( Ctrl + V ). A célula pode ter um Red Asterix (indicando que não está salvo)

Etapa 5

  • Clique em qualquer outra linha para acionar a instrução de inserção (o Red Asterix desaparecerá)

Nota - 1 : Se as colunas não estiverem na ordem correta como na tabela Destino, você sempre poderá seguir a Etapa 2 e selecionar as Colunas na mesma ordem que na tabela Destino

Nota - 2 - Se você tiver colunas de identidade, execute SET IDENTITY_INSERT sometableWithIdentity ONe siga as etapas acima e, no final, executeSET IDENTITY_INSERT sometableWithIdentity OFF

Mahesh
fonte
3

Se você estiver transferindo muitos dados permanentemente, ou seja, não preenchendo uma tabela temporária, eu recomendaria o uso de Dados de Importação / Exportação do SQL Server para mapeamentos de tabela para tabela.

A ferramenta Importar / Exportar geralmente é melhor que o SQL direto quando você tem conversões de tipo e possível truncamento de valor em seu mapeamento. Geralmente, quanto mais complexo seu mapeamento, mais produtivo você está usando uma ferramenta ETL como o SSIS (Integration Services) em vez de SQL direto.

A ferramenta Import / Export é na verdade um assistente do SSIS, e você pode salvar seu trabalho como um pacote dtsx.

mika
fonte
2

Eu acho que essa afirmação pode fazer o que você quiser.

INSERT INTO newTableName (SELECT column1, column2, column3 FROM oldTable);
Chris Ballance
fonte
0
 Dim ofd As New OpenFileDialog
                ofd.Filter = "*.mdb|*.MDB"
                ofd.FilterIndex = (2)
                ofd.FileName = "bd1.mdb"
                ofd.Title = "SELECCIONE LA BASE DE DATOS ORIGEN (bd1.mdb)"
                ofd.ShowDialog()
                Dim conexion1 = "Driver={Microsoft Access Driver (*.mdb)};DBQ=" + ofd.FileName
                Dim conn As New OdbcConnection()
                conn.ConnectionString = conexion1
                conn.Open()



            'EN ESTE CODIGO SOLO SE AGREGAN LOS DATOS'
            Dim ofd2 As New OpenFileDialog
            ofd2.Filter = "*.mdb|*.MDB"
            ofd2.FilterIndex = (2)
            ofd2.FileName = "bd1.mdb"
            ofd2.Title = "SELECCIONE LA BASE DE DATOS DESTINO (bd1.mdb)"
            ofd2.ShowDialog()
            Dim conexion2 = "Driver={Microsoft Access Driver (*.mdb)};DBQ=" + ofd2.FileName
            Dim conn2 As New OdbcConnection()
            conn2.ConnectionString = conexion2
            Dim cmd2 As New OdbcCommand
            Dim CADENA2 As String

            CADENA2 = "INSERT INTO EXISTENCIA IN '" + ofd2.FileName + "' SELECT * FROM EXISTENCIA IN '" + ofd.FileName + "'"


            cmd2.CommandText = CADENA2
            cmd2.Connection = conn2
            conn2.Open()
            Dim dA2 As New OdbcDataAdapter
            dA2.SelectCommand = cmd2
            Dim midataset2 As New DataSet
            dA2.Fill(midataset2, "EXISTENCIA")
JORGE
fonte