Você pode usar uma associação para criar e preencher a nova tabela de uma só vez:
SELECT
t.*
INTO
dbo.NewTable
FROM
dbo.TableWithIdentity AS t
LEFT JOIN dbo.TableWithIdentity ON 1 = 0
;
Por causa da 1 = 0
condição, o lado direito não terá correspondências e, assim, evitará a duplicação das linhas do lado esquerdo e, por ser uma junção externa, as linhas do lado esquerdo também não serão eliminadas. Por fim, como se trata de uma associação, a propriedade IDENTITY é eliminada.
Selecionar apenas as colunas do lado esquerdo, portanto, produzirá uma cópia exata do dbo.TableWithIdentity somente em dados, ou seja, com a propriedade IDENTITY removida.
Tudo isso dito, Max Vernon levantou um ponto válido em um comentário que vale a pena ter em mente. Se você observar o plano de execução da consulta acima:
você notará que a tabela de origem é mencionada no plano de execução apenas uma vez. A outra instância foi eliminada pelo otimizador.
Portanto, se o otimizador puder estabelecer corretamente que o lado direito da junção não é necessário no plano, deve ser razoável esperar que em uma versão futura do SQL Server seja possível descobrir que a propriedade IDENTITY não precisa ser removido também, pois não há mais outra coluna IDENTITY na linha de origem definida de acordo com o plano de consulta. Isso significa que a consulta acima pode parar de funcionar conforme o esperado em algum momento.
Mas, como observado corretamente pelo ypercubeᵀᴹ , até agora o manual afirmou explicitamente que, se houver uma junção, a propriedade IDENTITY não será preservada:
Quando uma coluna de identidade existente é selecionada em uma nova tabela, a nova coluna herda a propriedade IDENTITY, a menos que [...] a instrução SELECT contenha uma junção.
Portanto, enquanto o manual continuar mencionando, provavelmente podemos ter certeza de que o comportamento permanecerá o mesmo.
Parabéns a Shaneis e ypercubeᵀᴹ por abrir um tópico relacionado no chat.
JOIN (SELECT 1) AS dummy ON 1 = 1
também?CROSS JOIN (SELECT 1)
,INNER JOIN (SELECT 1) ON 1=1
,LEFT JOIN (SELECT 1) ON 1=0
OuON 1=1
- nenhum tiras a identidade. Parece que deve ser um objeto declarado ou criado .Experimente este código ..
A
ISNULL
chamada garante que a nova coluna seja criada com capacidade deNOT NULL
nulidade.fonte
ISNULL()
ou o+0
que faz? Ou ambos são necessários?Apenas para mostrar uma maneira diferente:
Você pode usar um servidor vinculado .
Você pode criar temporariamente um servidor vinculado ao servidor local usando este:
Nesse momento, você executaria o
select * into
código, referenciando olocalserver
nome de quatro partes do servidor vinculado:Após a conclusão, limpe o
localserver
servidor vinculado com este:Ou você pode usar
OPENQUERY
sintaxefonte
A propriedade identity não é transferida se a instrução select contiver uma associação e, portanto,
também fornecerá o comportamento desejado (da
id
coluna copiada para não manter aIDENTITY
propriedade. No entanto, ele terá o efeito colateral de não copiar nenhuma linha! (como em alguns outros métodos), então você precisará fazer:(obrigado AakashM!)
fonte
A maneira mais fácil é tornar a coluna parte de uma expressão.
Exemplo:
se a tabela dbo.Employee tiver uma identidade na coluna ID, no exemplo abaixo da tabela temporária #t também terá uma IDENTITY na coluna ID.
Altere isso para aplicar uma expressão ao ID e você #t não terá mais uma coluna IDENTITY on ID. Nesse caso, aplicamos uma adição simples à coluna ID.
Outros exemplos de expressões para outros tipos de dados podem incluir: convert (), concatenação de cadeias ou Isnull ()
fonte
Às vezes, você deseja inserir a partir de uma tabela em que não sabe (ou não se importa) se a coluna foi criada usando IDENTITY ou não. Pode até não ser uma coluna inteira com a qual você está trabalhando. Nesse caso, o seguinte funcionará:
ISNULL eliminará o atributo IDENTITY da coluna, mas o inserirá com o mesmo nome e tipo da coluna original e também o tornará nulo. TOP (0) criará uma tabela vazia que você poderá usar para inserir as linhas selecionadas. Você também pode compactar a tabela antes de inserir dados, se necessário.
fonte
irá remover a identidade.
A desvantagem é que
id
se torna anulável, mas você pode adicionar essa restrição.fonte
Você não
select * into
preserva a identidade.fonte
*
.identity
propriedade nem sempre é preservada, como outras respostas apontaram.