Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Zwiększanie niestandardowych wartości klucza podstawowego w SQL

Zanim podasz rozwiązanie pytania, kilka punktów w swoim pytaniu:

  1. 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).
  2. 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

  1. 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.

  1. 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ą.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Czy istnieje różnica między metodami transakcji SMO ServerConnection a korzystaniem z właściwości SqlConnectionObject?

  2. Konwertowanie pliku SQL2008 RDL na SQL2005

  3. Przywracanie bazy danych programu SQL Server — nie powiodło się:38 (Osiągnięto koniec pliku.)

  4. Szybkie wstawianie relacyjnych (znormalizowanych) tabel danych do bazy danych SQL Server 2008

  5. Jak mogę zapytać o kulturę bazy danych (SQL Server 2005)?