自动生成卷号的存储过程?

问题描述 投票:0回答:2

伙计们,我有一个存储过程,用于将新学生添加到数据库中。添加学生的表有

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

我希望您从上面的例子中明白了要点……现在我该怎么做呢?我可以连接批次+离开,但是我应该如何增加卷号(基于数据库中的先前条目)?

sql-server stored-procedures sql-server-2008-r2
2个回答
1
投票

你需要做两件事:

  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
    编号。

  2. 您需要一个存储过程,返回给您一个新的卷号以供使用,给定年份和部门 - 类似这样:

    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

中使用它

0
投票
  1. 列出项目
  2. Fazal在此处输入图像描述
  3. 父亲姓名
  4. 卷号
  5. 班级
© www.soinside.com 2019 - 2024. All rights reserved.