Преди да дадете решение на въпроса, няколко точки по вашия въпрос:
- Тъй като персонализираният първичен ключ се състои главно от три части Дата (140102), физическо местоположение, където се извършва транзакцията (entityID), номер на 4 места (9999).
- Според дизайна на една дата в едно физическо местоположение не може да има повече от 9999 транзакции -- My Solution също ще съдържа същото ограничение.
Някои точки от моето решение
- 4-местната цифра е свързана с датата, което означава, че за нова дата броенето започва от 0000. За примерGI_140102_1_0001,GI_140102_1_0002,GI_140102_1_0003,GI_140103_1_0000,GI_140104_1_0000
Така или иначе това поле ще бъде уникално.
- Решението сравнява най-новата дата в записа с текущата дата. Логиката:Ако текущата дата и последната дата в записа съвпадат, то увеличава 4-местната цифра със стойността с 1 Ако текущата дата и последната дата в записа не съответства Задава 4-местната цифра със стойност 0000.
Решението:(Кодът по-долу дава стойността, която ще бъде следващият GoodsInwardId, използвайте го според изискванията, за да се вмести във вашето решение)
declare @previous nvarchar(30);
declare @today nvarchar(30);
declare @newID nvarchar(30);
select @previous=substring(max(GoodsInwardId),4,6) from SC_TD_GoodsInward;
Select @today=RIGHT('00'+CONVERT(varchar,datepart(YY,getdate())),2)
+RIGHT('00'+CONVERT(varchar,datepart(MM,getdate())),2)+RIGHT('00'+CONVERT(varchar,datepart(DD,getdate())),2);
if @[email protected]
BEGIN
Select @newID='GI_'+RIGHT('00'+CONVERT(varchar,datepart(YY,getdate())),2)
+RIGHT('00'+CONVERT(varchar,datepart(MM,getdate())),2)+RIGHT('00'+CONVERT(varchar,datepart(DD,getdate())),2)
+'_'+CONVERT(varchar,1)+'_'+(SELECT RIGHT('0000'+
CONVERT(VARCHAR,CONVERT(INT,RIGHT(MAX(GoodsInwardId),4))+1),4)
from SC_TD_GoodsInward);
END
else
BEGIN
SET @newID='GI_'+RIGHT('00'+CONVERT(varchar,datepart(YY,getdate())),2)
+RIGHT('00'+CONVERT(varchar,datepart(MM,getdate())),2)+RIGHT('00'+CONVERT(varchar,datepart(DD,getdate())),2)
+'_'+CONVERT(varchar,1)+'_0000';
END
select @newID;
T-SQL за създаване на необходимата структура (вероятно предположение)
За таблицата:
CREATE TABLE [dbo].[SC_TD_GoodsInward](
[EntityId] [int] NULL,
[GoodsInwardId] [nvarchar](30) NULL
)
Примерни записи за таблицата:
insert into dbo.SC_TD_GoodsInward values(1,'GI_140102_1_0000');
insert into dbo.SC_TD_GoodsInward values(1,'GI_140101_1_9999');
insert into dbo.SC_TD_GoodsInward values(1,'GI_140101_1_0001');
**Това е вероятно решение във вашата ситуация, въпреки че идеалното решение би било да имате колона за идентичност (използвайте повторно зареждане, ако е необходимо) и да я свържете с текущата дата като изчислена колона.