Reputation: 3
I am encountering this kind of advance SQL coding task like generating an auto-increment primary key ID that consists of a year, a special char and a sequential series no.
Something like this.
2018-00000
2018-00001
so on and so forth...
I barely made this code
CREATE TABLE [dbo].[STUDENT]
(
[Stud_ID] [varchar](10) NOT NULL,
[Stud_LName] [varchar](100) NOT NULL,
[Stud_FName] [varchar](100) NOT NULL,
[Stud_MName] [varchar](100) NOT NULL,
)
That will output like this
Stud_ID Stud_LName Stud_FName Stud_MName
--------------------------------------------------
2018-00000 Doe Jane Stack
2018-00001 Doe John Stack
Upvotes: 0
Views: 2422
Reputation: 82474
Here is a complete solution. Please note that it's exactly the same as the duplicate I've marked - Database scheme, autoincrement - Just different details.
CREATE TABLE [dbo].[STUDENT]
(
[ID] int identity(1,1) PRIMARY KEY,
[Stud_LName] [varchar](100) NOT NULL,
[Stud_FName] [varchar](100) NOT NULL,
[Stud_MName] [varchar](100) NOT NULL
)
GO
CREATE FUNCTION dbo.GetSudentId
(
@id int
)
RETURNS varchar(10)
AS
BEGIN
RETURN Concat(Year(Getdate()), '-', RIGHT(Concat('0000', (SELECT COUNT(*) FROM STUDENT WHERE id < @Id)), 6))
END
GO
ALTER TABLE [dbo].[STUDENT]
ADD Stud_ID AS (dbo.GetSudentId(Id))
GO
Please note that the primary key of the table must still be the identity
column (as shown in the script) since the computed column can't be the primary key.
Upvotes: 3
Reputation: 1173
You should go through Computed column, which helps to manage your design. Please refer below example.
CREATE TABLE #test(id INT IDENTITY(1,1) PRIMARY KEY,
Stud_ID AS CAST(YEAR(GETDATE()) as VARCHAR(4)) +'-'+ REPLICATE('0', 5 - DATALENGTH(CAST(id as VARCHAR(10))))+ CAST(id as VARCHAR(10)),
Stud_LName VARCHAR(100),
Stud_FName VARCHAR(100),
Stud_MName VARCHAR(100)
)
INSERT INTO #test(Stud_LName, Stud_FName, Stud_MName)
values
('lname_1' , 'fname 1', 'mname 1'),
('lname_2' , 'fname 2', 'mname 2'),
('lname_3' , 'fname 3', 'mname 3'),
('lname_4' , 'fname 4', 'mname 4'),
('lname_5' , 'fname 5', 'mname 5'),
('lname_6' , 'fname 6', 'mname 6'),
('lname_7' , 'fname 7', 'mname 7'),
('lname_8' , 'fname 8', 'mname 8'),
('lname_9' , 'fname 9', 'mname 9'),
('lname_10', 'fname 10', 'mname 10')
select * from #test;
DROP TABLE #test;
Upvotes: 0