Zanim podasz rozwiązanie pytania, kilka punktów w swoim pytaniu:
- Ponieważ niestandardowy klucz podstawowy składa się głównie z trzech części Data (140102), fizycznej lokalizacji, w której odbywa się transakcja (identityID), 4 numeru miejsca (9999).
- Zgodnie z projektem w jednym dniu w jednej fizycznej lokalizacji nie może być więcej niż 9999 transakcji — Moje rozwiązanie również będzie zawierało to samo ograniczenie.
Kilka punktów na temat mojego rozwiązania
- Cyfra 4 miejsca jest powiązana z datą, co oznacza, że dla nowej daty liczenie zaczyna się od 0000. Na przykład GI_140102_1_0001,GI_140102_1_0002,GI_140102_1_0003,GI_140103_1_0000,GI_140104_1_0000
W każdym razie to pole będzie unikalne.
- Rozwiązanie porównuje ostatnią datę w rekordzie z datą bieżącą. Logika:Jeśli bieżąca data i ostatnia data w rekordzie są zgodne, to zwiększa 4 cyfrę miejsca o wartość o 1, jeśli bieżąca data i ostatnia data w rekordzie nie pasuje Ustawia cyfrę 4 miejsca na wartość 0000.
Rozwiązanie:(Poniższy kod podaje wartość, która będzie następnym GoodsInwardId, użyj go zgodnie z wymaganiami, aby dopasować się do rozwiązania)
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 do utworzenia wymaganej struktury (prawdopodobne zgadnięcie)
Do stołu:
CREATE TABLE [dbo].[SC_TD_GoodsInward](
[EntityId] [int] NULL,
[GoodsInwardId] [nvarchar](30) NULL
)
Przykładowe rekordy dla tabeli:
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');
**Jest to prawdopodobne rozwiązanie w Twojej sytuacji, chociaż idealnym rozwiązaniem byłoby posiadanie kolumny tożsamości (w razie potrzeby użyj reseed) i powiązanie jej z bieżącą datą jako kolumną obliczoną.