Essa pergunta chega perto do que eu preciso, mas meu cenário é um pouco diferente. A tabela de origem e a tabela de destino são as mesmas e a chave primária é um identificador exclusivo (guid). Quando eu tento isso:
insert into MyTable
select * from MyTable where uniqueId = @Id;
Obviamente, recebo uma violação de restrição de chave primária, pois estou tentando copiar a chave primária. Na verdade, não quero copiar a chave primária. Em vez disso, quero criar um novo. Além disso, gostaria de copiar seletivamente sobre determinados campos e deixar os outros nulos. Para tornar as coisas mais complexas, preciso pegar a chave primária do registro original e inseri-la em outro campo da cópia (campo PreviousId).
Tenho certeza de que existe uma solução fácil para isso, simplesmente não conheço TSQL suficiente para saber o que é.
fonte
Ok, eu sei que é um problema antigo, mas eu posto minha resposta de qualquer maneira.
Eu gosto desta solução. Eu só tenho que especificar a (s) coluna (s) de identidade.
A coluna "id" é a coluna de identidade e essa é a única coluna que tenho que especificar. É melhor do que o contrário, de qualquer maneira. :-)
Eu uso o SQL Server. Você pode usar "
CREATE TABLE
" e "UPDATE TABLE
" nas linhas 1 e 2. Hmm, vi que realmente não dei a resposta que ele queria. Ele queria copiar o ID para outra coluna também. Mas essa solução é boa para fazer uma cópia com um novo ID automático.Eu edito minha solução com as idéias de Michael Dibbets.
Você pode soltar mais de uma coluna, separando-as com um ",". O: id deve ser substituído pelo id da linha que você deseja copiar. MyDatabase, MyTable e IndexField devem ser substituídos por seus nomes (é claro).
fonte
TempTable
, não seria melhor usar#TempTable
, por isso é uma verdadeira tabela temporária?use MyDatabase; SELECT * INTO #TempTable FROM [TABLE] WHERE [indexfield] = :id; ALTER TABLE #TempTable DROP COLUMN [indexfield]; INSERT INTO [TABLE] SELECT * FROM #TempTable; DROP TABLE #TempTable;
Dessa forma, sei que será limpo o mais rápido possível, sem atrasos na gravação de um arquivo intermitente no disco.$identity
se você não quer codificar seu nome coluna de identidadeAcho que você está tentando evitar escrever todos os nomes das colunas. Se você estiver usando o SQL Management Studio, poderá clicar com o botão direito do mouse na tabela e em Script como Inserir .. e poderá mexer nessa saída para criar sua consulta.
fonte
Especifique todos os campos, exceto o seu campo de ID.
fonte
Tenho o mesmo problema em que quero que um único script funcione com uma tabela que tenha colunas adicionadas periodicamente por outros desenvolvedores. Não apenas isso, mas também estou suportando muitas versões diferentes de nosso banco de dados, pois os clientes podem não estar atualizados com a versão atual.
Peguei a solução por Jonas e a modifiquei um pouco. Isso permite que eu faça uma cópia da linha e altere a chave primária antes de adicioná-la novamente à tabela de origem original. Isso também é realmente útil para trabalhar com tabelas que não permitem valores NULL em colunas e não é necessário especificar o nome de cada coluna no INSERT.
Este código copia a linha de 'ABC' para 'XYZ'
Depois de terminar, solte a tabela temporária.
fonte
Eu sei que minha resposta está atrasada para a festa. Mas a maneira que resolvi é um pouco diferente de todas as respostas.
Eu tive uma situação, eu preciso clonar uma linha em uma tabela, exceto algumas colunas. Esses poucos terão novos valores. Esse processo deve oferecer suporte automaticamente para futuras alterações na tabela. Isso implica, clonar o registro sem especificar nenhum nome de coluna.
Minha abordagem é,
fonte
fonte
Se "key" for o seu campo PK e for numérico automático.
ele irá gerar um novo registro, copiando o campo1 e o campo2 do registro original
fonte
Minha tabela possui 100 campos e eu precisava de uma consulta para funcionar. Agora posso alternar qualquer número de campos com alguma lógica condicional básica e não me preocupar com sua posição ordinal.
Substitua o nome da tabela abaixo pelo nome da tabela
Substitua o nome do campo de identidade original pelo seu nome de campo PK
Substitua os nomes das tabelas novamente (nome da tabela de destino e nome da tabela de origem); edite suas
where
condiçõesfonte
Você pode fazer assim:
Em vez de 112, você deve colocar um número do ID máximo na tabela DENI / FRIEN01P.
fonte
Aqui está como eu fiz isso usando o ASP classic e não consegui fazê-lo funcionar com as respostas acima. Queria poder copiar um produto em nosso sistema para um novo product_id e precisava que ele funcionasse mesmo quando adicione mais colunas à tabela.
fonte