SQL Server 2008 R2 - Генерация уникального номера - PullRequest
0 голосов
/ 15 февраля 2019

Требование

Мне нужен способ генерировать новый уникальный номер (номер счета-фактуры) в непрерывной последовательности (при создании нового номера не следует пропускать номер)

Допустимый пример : 1, 2, 3, 4

Неверный пример : 1, 2, 4, 3 (не в непрерывной последовательности)

Схема тока

Вот моя существующая схема таблицы в таблице Тест enter image description here

Решение, которое я придумала

После выполненияВ некоторых исследованиях я придумал приведенный ниже код, который, кажется, работает на данный момент.

DECLARE @i as int=0
While(@i<=10000 * 10000)
BEGIN
    Begin Transaction

        Insert Into Test(UniqueNo,[Text])values((Select     IsNull(MAX(UniqueNo),0)+1 from Test with (TABLOCK)),'a')
    COMMIT  

    SET @i = @i + 1;
END

Тестирование

Я попытался запустить код из 12 различных запросов SQL или 12 потоков, которые вы можете сказатьи в настоящее время он генерирует новое и уникальное значение для каждой записи, даже после вставки 162 921 строк

enter image description here

Основной вопрос

Может ли приведенный выше код привести к дублированию значений?

Я попробовал его методом проб и ошибок, и он отлично работает НО когда я углубляюсь в блокировка транзакции оператор выбора генерирует Shared Lock для всей таблицы, что означает, что он позволит одновременным транзакциям получить доступ кодни и те же данные, верно?

Это означает, что несколько транзакций могут генерировать повторяющиеся значения, верно?

Тогда как же я не могу увидеть какие-либо дублирующиеся значения?

РЕДАКТИРОВАТЬ

Согласно комментарию Дэвида
Я не могу использовать поле идентификатора, потому что в любом случае, если я удалю запись, мне будет сложно заполнить это число.

1 Ответ

0 голосов
/ 17 февраля 2019

этот процесс может создать ваш номер проверки.

create procedure [dbo].[aa] @var int
as
declare @isexists int=0
declare @lastnum int=0
set @isexists=(select isnull((select [text] from t000test where [text]=@var),0))
if(isnull(@isexists,0)<=0)
begin 
 set @lastnum=(select isnull( max([text]),0) from t000test )
 if(@var>@lastnum)
 begin
  insert into t000test(text) values (@var)
 end
 else
  print 'your number dose not in rang'
end
else
print 'your number exists in the data'
GO

вы можете протестировать эту процедуру следующим образом:

exec dbo.aa 6 - или любое число, которое вам нравится

и этот цикл автоматически создает ваш номер по диапазону, который вам нравится

declare @yourrange int =50
declare @id int =0;
while @yourrange>0
begin
exec dbo.aa @id
set @id=@id+1;
set @yourrange=@yourrange-1;
end

я использую 50, но вы можете использовать больший диапазон или меньше

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...