Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Inkrementieren benutzerdefinierter Primärschlüsselwerte in SQL

Bevor Sie eine Lösung für die Frage geben, einige Punkte zu Ihrer Frage:

  1. Da der benutzerdefinierte Primärschlüssel hauptsächlich aus drei Teilen besteht:Datum (140102), physischer Ort, an dem die Transaktion stattfindet (entityID), 4-stellige Zahl (9999).
  2. Gemäß dem Design darf es an einem einzelnen Datum an einem einzelnen physischen Ort nicht mehr als 9999 Transaktionen geben – My Solution enthält ebenfalls dieselbe Einschränkung.

Einige Punkte zu meiner Lösung

  1. Die 4-stellige Ziffer ist an das Datum gebunden, was bedeutet, dass bei einem neuen Datum die Zählung bei 0000 beginnt. Zum BeispielGI_140102_1_0001,GI_140102_1_0002,GI_140102_1_0003,GI_140103_1_0000,GI_140104_1_0000

In jedem Fall ist dieses Feld eindeutig.

  1. Die Lösung vergleicht das späteste Datum im Datensatz mit dem aktuellen Datum. Die Logik:Wenn das aktuelle Datum und das späteste Datum im Datensatz übereinstimmen, wird die 4-stellige Ziffer um den Wert um 1 erhöht, wenn das aktuelle Datum und das späteste Datum im Datensatz sind does not matchedDas setzt die 4-stellige Ziffer auf den Wert 0000.

Die Lösung:(Der folgende Code gibt den Wert aus, der die nächste GoodsInwardId sein wird. Verwenden Sie sie gemäß den Anforderungen, um sie in Ihre Lösung einzufügen)

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 zum Erstellen der erforderlichen Struktur (Probable Guess)

Für die Tabelle:

CREATE TABLE [dbo].[SC_TD_GoodsInward](
    [EntityId] [int] NULL,
    [GoodsInwardId] [nvarchar](30) NULL
)

Beispieldatensätze für die Tabelle:

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');

**Es ist eine wahrscheinliche Lösung in Ihrer Situation, obwohl die perfekte Lösung darin bestünde, eine Identitätsspalte zu haben (bei Bedarf Reseed zu verwenden) und sie mit dem aktuellen Datum als berechnete Spalte zu verknüpfen.