伙计我有一个存储过程,用于将新学生添加到数据库。添加学生的表格包含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
我希望你能从上面的例子中得到答案......现在我该怎样做呢?我可以连接批处理+离开但是我应该如何增加roll no(基于db中的先前条目)?
答案 0 :(得分:1)
你需要做两件事:
创建一个表格来保存您已经发出的滚动号码 - 如下所示:
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