Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Увеличаване на персонализирани стойности на първичен ключ в SQL

Преди да дадете решение на въпроса, няколко точки по вашия въпрос:

  1. Тъй като персонализираният първичен ключ се състои главно от три части Дата (140102), физическо местоположение, където се извършва транзакцията (entityID), номер на 4 места (9999).
  2. Според дизайна на една дата в едно физическо местоположение не може да има повече от 9999 транзакции -- My Solution също ще съдържа същото ограничение.

Някои точки от моето решение

  1. 4-местната цифра е свързана с датата, което означава, че за нова дата броенето започва от 0000. За примерGI_140102_1_0001,GI_140102_1_0002,GI_140102_1_0003,GI_140103_1_0000,GI_140104_1_0000

Така или иначе това поле ще бъде уникално.

  1. Решението сравнява най-новата дата в записа с текущата дата. Логиката:Ако текущата дата и последната дата в записа съвпадат, то увеличава 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');

**Това е вероятно решение във вашата ситуация, въпреки че идеалното решение би било да имате колона за идентичност (използвайте повторно зареждане, ако е необходимо) и да я свържете с текущата дата като изчислена колона.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. не може да свърже sql сървър 2008 от друг компютър

  2. SQL Server varbinary bigint със стойностите на BitConverter.ToInt64 са различни

  3. MS Excel - обединяване на външни (SQL) данни с локална таблица (лист)

  4. Пребройте броя на дните on_hire през JAN

  5. Как да извлечете имена на полета от временна таблица (SQL Server 2008)