伙计们,我有一个存储过程,用于将新学生添加到数据库中。添加学生的表有
ID, Name, Batch, Department
和 roll no
列。
现在我想要在存储过程中做的是,我想获取用户输入的批次年份(例如,2010)和输入的部门(例如计算机工程的CE),然后自动生成基于卷无列的关于这一点。 (例如,2010-CE-1,然后是下一个 2010-CE-2,依此类推...)但如果用户选择不同的年份或批次,则应继续该序列中的卷号。
例如:
Batch : 2010 | Depart : CE | "auto-generated roll no" : 2010-CE-01
Batch : 2010 | Depart : CE | "auto-generated roll no" : 2010-CE-02
Batch : 2012 | Depart : CE | "auto-generated roll no" : 2012-CE-01
Batch : 2010 | Depart : CS | "auto-generated roll no" : 2010-CS-01
Batch : 2010 | Depart : CS | "auto-generated roll no" : 2010-CS-02
我希望您从上面的例子中明白了要点……现在我该怎么做呢?我可以连接批次+离开,但是我应该如何增加卷号(基于数据库中的先前条目)?
你需要做两件事:
创建一个表来保存您已经给出的卷号 - 像这样:
CREATE TABLE dbo.RollNumbers
(
ID INT IDENTITY(1,1) NOT NULL PRIMARY KEY CLUSTERED,
RollYear INT,
DepartmentID CHAR(2),
LastRollNo INT
)
此表将保存每个
LastRollNo
和 RollYear
的最后发布的 DeptId
编号。您需要一个存储过程,返回给您一个新的卷号以供使用,给定年份和部门 - 类似这样:
CREATE PROCEDURE dbo.GetRollNo (@Year INT, @DeptId CHAR(2))
AS BEGIN
DECLARE @Output INT
-- if we already have an entry for that year & department
-- return the next value in a single atomic UPDATE statement
IF EXISTS (SELECT * FROM dbo.RollNumbers
WHERE RollYear = @Year AND DepartmentID = @DeptId)
BEGIN
-- temporary table variable to hold output values
DECLARE @NewRollNo TABLE (RollNo INT)
UPDATE dbo.RollNumbers
SET LastRollNo = LastRollNo + 1
OUTPUT INSERTED.LastRollNo INTO @NewRollNo
WHERE RollYear = @Year AND DepartmentID = @DeptId
-- Select the one and only value from @NewRollNo into @Output
SELECT TOP (1) @Output = RollNo FROM @NewRollNo
END
ELSE
BEGIN
-- if no entry existed - create a new entry, return "1"
INSERT INTO dbo.RollNumbers(RollYear, DepartmentID, LastRollNo)
VALUES (@Year, @DeptId, 1)
SELECT @Output = 1
END
RETURN @Output
END
现在您可以在插入数据之前调用此存储过程,并获取要使用的下一个卷号:
DECLARE @NextRollNo INT
EXEC @NextRollNo = dbo.GetRollNo @Year = 2014, @DeptId = 'CE'
SELECT @NextRollNo
瞧 - 对于给定的 (
RollNo
),您拥有下一个有效的 Year, DeptId
,您可以在您的 INSERT
中使用它