Estou tentando fazer essa consulta
INSERT INTO dbo.tbl_A_archive
SELECT *
FROM SERVER0031.DB.dbo.tbl_A
mas mesmo depois que eu corri
set identity_insert dbo.tbl_A_archive on
Estou recebendo esta mensagem de erro
Um valor explícito para a coluna de identidade na tabela 'dbo.tbl_A_archive' só pode ser especificado quando uma lista de colunas é usada e IDENTITY_INSERT está ativado.
tbl_A
é uma tabela enorme em linhas e largura, ou seja, tem muitas colunas. Não quero digitar todas as colunas manualmente. Como posso fazer isso funcionar?
sql-server
jhowe
fonte
fonte
Respostas:
Resumo
O SQL Server não permitirá que você insira um valor explícito em uma coluna de identidade, a menos que você use uma lista de colunas. Assim, você tem as seguintes opções:
OU
tbl_A_archive
uma coluna regular, sem identidade : se sua tabela é uma tabela de arquivamento e você sempre especifica um valor explícito para a coluna de identidade, por que você precisa de uma coluna de identidade? Basta usar um int regular.Detalhes sobre a solução 1
Ao invés de
você precisa escrever
com
field1, field2, ...
contendo os nomes de todas as colunas em suas tabelas. Se você deseja gerar automaticamente essa lista de colunas, veja a resposta de Dave ou Andomar .Detalhes sobre a solução 2
Infelizmente, não é possível apenas "alterar o tipo" de uma coluna int de identidade para uma coluna int de não identidade. Basicamente, você tem as seguintes opções:
OU
Identity Specification
/(Is Identity)
da coluna de identidade na sua tabela de arquivamentoNo
. Nos bastidores, isso criará um script para recriar a tabela e copiar os dados existentes; portanto, para isso, você também precisará desmarcarTools
/Options
/Designers
/Table and Database Designers
/Prevent saving changes that require table re-creation
.OU
fonte
Você precisa fazer uma lista de colunas para sua instrução INSERT:
não é como "INSERIR na tabelaA SELECT ........"
fonte
Se você estiver usando o SQL Server Management Studio, não precisará digitar a lista de colunas - basta clicar com o botão direito do mouse na tabela no Pesquisador de Objetos e escolher Tabela de Scripts como -> SELECIONAR para -> Nova Janela do Editor de Consultas .
Se não estiver, uma consulta semelhante a esta deve ajudar como ponto de partida:
fonte
Concorde com a resposta de Heinzi. Para a primeira segunda opção, veja uma consulta que gera uma lista de colunas separada por vírgula em uma tabela:
Para tabelas grandes, isso pode economizar muito trabalho de digitação :)
fonte
Se a tabela "archive" for uma cópia exata da tabela principal, sugiro que você remova o fato de que o id é uma coluna de identificação. Dessa forma, você poderá inseri-los.
Como alternativa, você pode permitir e a identidade não permitida é inserida na tabela com a seguinte instrução
Por fim, se você precisar que a coluna de identidade funcione como está, sempre poderá executar o processo armazenado.
Isso retornará todas as colunas da tabela, que você poderá recortar e colar na sua consulta. (Isso é quase sempre melhor do que usar um *)
fonte
Para a instrução SQL, você também deve especificar a lista de colunas. Por exemplo.
ao invés de
fonte
Ambos funcionarão, mas se você ainda receber um erro usando o número 1, vá para o número 2
1)
2)
fonte
Para preencher todos os nomes de colunas em uma lista delimitada por vírgula para uma instrução Select para as soluções mencionadas para esta pergunta, eu uso as seguintes opções, pois elas são um pouco menos detalhadas do que a maioria das respostas aqui. Embora, a maioria das respostas aqui ainda sejam perfeitamente aceitáveis, no entanto.
1)
2) Essa é provavelmente a abordagem mais simples para criar colunas, se você tiver o SQL Server SSMS.
fonte
Você deve especificar o nome das colunas que deseja inserir se houver uma coluna Identidade. Portanto, o comando será assim abaixo:
Se sua tabela tiver muitas colunas, obtenha o nome dessas colunas usando este comando.
(após remover a última vírgula (',')) Basta copiar o nome das colunas anteriores.
fonte
Isso deve funcionar. Acabei de encontrar seu problema:
Infelizmente, parece que você precisa de uma lista de colunas, incluindo a coluna de identidade, para inserir registros que especificam a identidade. No entanto , você não precisa listar as colunas no SELECT. Como o @Dave Cluderay sugeriu, isso resultará em uma lista formatada para você copiar e colar (se tiver menos de 200000 caracteres).
Eu adicionei o USE, pois estou alternando entre instâncias.
fonte
Assim não
fonte
Este trecho de código mostra como inserir na tabela quando a coluna Chave Primária da identidade está LIGADA.
fonte
Pois se você deseja inserir seus valores de uma tabela para outra através de um procedimento armazenado. Eu usei isso e isso , o último, que é quase como a resposta de Andomar.
fonte
Há uma ou mais colunas que possuem propriedade de incremento automático ou o valor desse atributo será calculado como restrições. Você está tentando modificar essa coluna.
Há duas maneiras de resolvê-lo: 1) Mencione outras colunas explicitamente e defina apenas seus valores, e o valor PrimaryKey ou a coluna de incremento automático serão definidos automaticamente.
2) Você pode ativar INDENTITY_INSERT e, em seguida, executar sua consulta de inserção, desative IDENTITY_INSERT.
Sugestão: Siga o primeiro passo, porque é uma abordagem mais adequada e eficiente.
Para mais informações, leia este artigo no SQL-helper .
fonte
Certifique-se de que os nomes das colunas, tipos de dados e ordem na tabela de onde você está selecionando registros sejam exatamente iguais à tabela de destino. A única diferença deve ser que a tabela de destino possui uma coluna de identidade como a primeira coluna, que não existe na tabela de origem.
Eu estava enfrentando um problema semelhante ao executar "INSERT INTO table_Dest SELECT * FROM table_source_linked_server_excel". As tabelas tinham 115 colunas.
Eu tinha duas tabelas em que estava carregando dados do Excel (como servidor vinculado) em tabelas no banco de dados. Nas tabelas do banco de dados, eu adicionei uma coluna de identidade chamada 'id' que não estava lá no Excel de origem. Para uma tabela, a consulta foi executada com êxito e, em outra, recebi o erro "Um valor explícito para a coluna de identidade na tabela só pode ser especificado quando uma lista de colunas é usada e IDENTITY_INSERT está no SQL Server". Isso foi intrigante, pois o cenário era exatamente o mesmo para as duas consultas. Então, investiguei isso e o que descobri foi que, na consulta em que estava recebendo erro com INSERT INTO .. SELECT *:
Depois de fazer as duas alterações acima, a consulta INSERT INTO ... SELECT * foi executada com êxito. A coluna de identidade na tabela de destino gerou valores de identidade para cada linha inserida conforme o esperado.
Portanto, mesmo que a tabela de destino possa ter uma coluna de identidade que não existe na tabela de origem, o INSERT INTO .. SELECT * será executado com êxito se os nomes, tipos de dados e ordem das colunas na origem e no destino forem exatamente os mesmos.
Espero que ajude alguém.
fonte
Acho que esse erro ocorre devido à incompatibilidade com o número de colunas na definição da tabela e o número de colunas na consulta de inserção. Além disso, o comprimento da coluna é omitido com o valor inserido. Portanto, basta revisar a definição da tabela para resolver esse problema
fonte