Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Possível implementar um incremento manual com apenas SQL INSERT simples?


Você entende que terá colisões certo?

você precisa fazer algo assim e isso pode causar impasses, portanto, tenha certeza do que está tentando realizar aqui
DECLARE @id int
BEGIN TRAN

    SELECT @id = MAX(id) + 1 FROM Table1 WITH (UPDLOCK, HOLDLOCK)
    INSERT INTO Table1(id, data_field)
    VALUES (@id ,'[blob of data]')
COMMIT TRAN

Para explicar a coisa da colisão, forneci algum código

primeiro crie esta tabela e insira uma linha
CREATE TABLE Table1(id int primary key not null, data_field char(100))
GO
Insert Table1 values(1,'[blob of data]')
Go

Agora abra duas janelas de consulta e execute isso ao mesmo tempo
declare @i int
set @i =1
while @i < 10000
begin
BEGIN TRAN

INSERT INTO Table1(id, data_field)
SELECT MAX(id) + 1, '[blob of data]' FROM Table1

COMMIT TRAN;
set @i [email protected] + 1
end

Você vai ver um monte desses

Servidor:Msg 2627, Level 14, State 1, Line 7Violation of PRIMARY KEY constraint 'PK__Table1__3213E83F2962141D'. Não é possível inserir a chave duplicada no objeto 'dbo.Table1'. A instrução foi encerrada.