r00n3y Ответов: 1

Автоматически сгенерированный номер с использованием хранимой процедуры или функции


У меня есть таблица со случайными числами. Формат-первые два всегда 90 (число начинается с), а последние четыре могут быть любой комбинацией, например этот И еще одна вещь, которую я хотел бы добавить, - это процедура проверки того, существует ли число уже или нет, если оно пропускает это число и т. д..

EDIT: id хотел бы упомянуть, что с этой хранимой процедурой я пытаюсь начать с 900001 до конца. При этом он придет к тому, что текущее число уже существует в таблице, и тогда он перейдет к следующему.

Что я уже пробовал:

Я пытался следовать этому:

Alter procedure Gen_SerialNumber
(
@ItemType char(1),
@ItemBatchNumber varchar(30),
@Date datetime,
@SerialNumber varchar(20) out,
@fifthDigit int
)
AS
Begin 
set @ItemType=(Select ItemType from ItemBatchNumber where ItemBatchNumber=@ItemBatchNumber)
Declare @SerialNumber1 varchar(20)
Set @SerialNumber1='xyz'+''+@ItemType+''+CAST( (Select COUNT(distinct ItemBatchNumber)from ItemBatchNumber
where ItemType=@ItemType) as varchar (10) )
Set @fifthDigit=SUBSTRING(@SerialNumber1,5,1)
if exists(Select SerialNumber from Gen_SN where SerialNumber=null or SerialNumber!=@SerialNumber)
set @fifthDigit=1
if exists(Select mfgDate,ItemBatchNumber from Gen_SN where mfgDate=@Date and ItemBatchNumber=@ItemBatchNumber)
Set @fifthDigit=1
else 
set @fifthDigit=@fifthDigit+1
 
Set @SerialNumber=('xyz'+''+@ItemType+''+cast(@fifthdigit as varchar(2)))
Insert into Gen_SN values(@ItemType,@ItemBatchNumber,@SerialNumber,@Date)
END

Получил это от здесь но не могу понять, так как моя ситуация немного отличается.

ZurdoDev

Какой у вас вопрос?

r00n3y

как я могу получить следующий порядковый номер, когда таблица не имеет всего в последовательности, и когда она получает его (убедитесь, что он уникален)?? Смотрите скриншот, который я опубликовал

ZurdoDev

Нет никакого волшебного способа сделать это. Вам просто нужно написать код. Напишите функцию, которая имеет цикл, и вы продолжаете цикл, пока не найдете следующую, которая не используется.

r00n3y

Я знаю, что волшебного пути не существует, а писать-это то, чего не хватает моим знаниям.

ZurdoDev

Посмотрите, как сделать цикл в sql, и начните с этого.

r00n3y

Я получил следующее:
Объявите @new_seq INT=(
ВЫБЕРИТЕ ТОП 1
[NewLeaseNumber] + 1
Из [LeaseNumber] mo с(ROWLOCK,XLOCK,HOLDLOCK)
Где не([NewLeaseNumber] имеет значение null) и не существует
(
ВЫБЕРИТЕ NULL
Из [LeaseNumber] mi с(ROWLOCK,XLOCK,HOLDLOCK)
Где Ми.[NewLeaseNumber] = mo.[NewLeaseNumber] + 1
)
ЗАКАЗАТЬ ПО
[NewLeaseNumber]
);
Если @new_seq равен NULL
BEGIN SET @new_seq=900001;
КОНЕЦ
ЕЩЕ
Начинаем набор @new_seq=@new_seq;
КОНЕЦ
Вставить в dbo.[LeaseNumber] ([NewLeaseNumber]) значения (@new_seq);

Но проблема в том, что в моей таблице было всего несколько сотен номеров, а 900001 нет, поэтому я хотел бы начать с этого. Какие-нибудь советы?

1 Ответов

Рейтинг:
1

Kornfeld Eliyahu Peter

SQL имеет РАНТ[^] функция для создания случайных чисел...

-- ОБНОВЛЕНИЕ, ЧТОБЫ ОТРАЗИТЬ КОММЕНТАРИЙ OP
У вас есть 3 варианта.
1. случайный, а это значит неуникальный (это Рэнд)
2. уникальный, но не случайный (последовательный) - столбец идентификаторов[^]
3. Как - идентификатор GUID[^]


r00n3y

я посмотрел на него, но проблема в том, что я не могу найти способ проверить, существует ли число уже или нет в таблице

Aria Jafarian

Просто подумайте вслух, не следует ли вам поместить каждое сгенерированное число в таблицу и проверить, существует ли оно или нет в этой таблице, прежде чем использовать его?

Dave Kreskowiak

Как насчет выбора для сгенерированного вами идентификационного номера? Это кажется довольно очевидным.