Мне нужно сгенерировать прогрессивное число счетов-фактур, избегая пробелов в последовательности:
Вначале я думал, что это довольно просто, как
SELECT MAX(Docnumber)+1 as NewDocNumber
from InvoicesHeader
, но, поскольку для созданиязапрос «вставить в InvoiceHeader» и другой запрос может поступить, назначив обеим счетам один и тот же NewDocNumber
. Теперь я думаю не создавать DocNumber в расширенном запросе и изменить его на:
INSERT INTO InvoicesHeader (InvoiceID,..., DocNumber,...)
SELECT @InvoiceID,..., MAX(Docnumber)+1,... FROM InvoicesHeader
но хотя (и должно) решить некоторые проблемы, он все еще небезопасен для потока и не подходит для условий гонки:
с добавлением TABLOCK
или UPDLOCK
, таким образом:
BEGIN TRANSACTION TR1
INSERT INTO InvoicesHeader WITH (TABLOCK)
(InvoiceID,..., DocNumber,...)
SELECT @InvoiceID,..., MAX(Docnumber)+1,... FROM InvoicesHeader
COMMIT TRANSACTION TR1
Решит вопрос?
Или лучше использовать ISOLATION LEVEL
, NEXT VALUE FOR
или другое решение?