Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Meningkatkan nilai kunci utama khusus dalam SQL

Sebelum memberikan solusi untuk pertanyaan beberapa poin pada pertanyaan Anda:

  1. Karena kunci utama Kustom sebagian besar terdiri dari tiga bagian Tanggal(140102), lokasi fisik tempat transaksi berlangsung (ID entitas), 4 nomor tempat(9999).
  2. Menurut desain pada satu tanggal di satu lokasi fisik, tidak boleh lebih dari 9999 transaksi -- Solusi Saya juga akan memiliki batasan yang sama.

Beberapa poin pada solusi saya

  1. Digit 4 tempat diikat dengan tanggal yang berarti untuk tanggal baru hitungannya dimulai dari 0000. MisalnyaGI_140102_1_0001, GI_140102_1_0002,GI_140102_1_0003,GI_140103_1_0000,GI_140104_1_0000

Bagaimanapun, bidang ini akan menjadi unik.

  1. Solusinya membandingkan tanggal terakhir dalam catatan dengan tanggal saat ini. Logika:Jika tanggal saat ini dan tanggal terakhir dalam catatan cocok, maka akan bertambah 4 digit tempat dengan nilai 1Jika tanggal saat ini dan tanggal terakhir dalam catatan tidak cocokIni menetapkan digit tempat ke-4 dengan nilai 0000.

Solusinya:(Kode di bawah ini memberikan nilai yang akan menjadi GoodsInwardId berikutnya, Gunakan sesuai kebutuhan agar sesuai dengan solusi Anda)

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 untuk membuat struktur yang diperlukan (Tebakan Kemungkinan)

Untuk tabel:

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

Contoh record untuk tabel:

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

**Ini kemungkinan solusi dalam situasi Anda meskipun solusi sempurna adalah memiliki kolom identitas (gunakan reseed jika diperlukan) dan ikat dengan tanggal saat ini sebagai kolom yang dihitung.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Apa itu Data &Informasi dan Volume Data

  2. Nama kolom sebagai parameter dalam pernyataan INSERT

  3. Permintaan SQL untuk menemukan hari terakhir bulan ini?

  4. Cara Membuat Alias ​​​​Tipe Data Buatan Pengguna di SQL Server menggunakan T-SQL

  5. Baris mana yang memiliki nilai tertinggi?