Estou apenas procurando entender por que isso está acontecendo, e minhas pesquisas no Google estavam falhando. Estamos no SQL Server 2016 SP1.
Esta é a situação: Tabela de fornecedores que gerencia os IDs acompanhando os valores atuais de cada tabela. Uma função pode ser chamada para retornar um bloco de IDs se você estiver fazendo uma inserção.
Então, configuramos uma tabela temporária selecionando da tabela real usando select into
(estamos clonando um conjunto de dados para ser reinserido com um conjunto de propriedades diferente).
Em seguida, chamamos a função e obtemos novos ids para o número de registros (ela apenas retorna o ID máximo, então fazemos algumas contas para obter o próximo id).
Em seguida, atualizamos a tabela como tal:
update #temp set @nextId = Id = @nextId + 1
com a expectativa de que ele incremente em um para cada registro e defina os ids.
Em vez disso, o mesmo ID foi definido para cada 4 registros, então seria incrementado e os próximos 4 obteriam o próximo id, etc. Por que a cada 4 registros? O que deu errado?
Ainda mais divertido, se colocarmos um índice clusterizado na tabela, tudo funciona corretamente.
Tenho certeza que tem a ver com a mesa ser um monte... mas não sei por quê.