自动生成卷的存储过程没有?

时间:2014-06-05 10:07:28

标签: sql-server stored-procedures sql-server-2008-r2

伙计我有一个存储过程,用于将新学生添加到数据库。添加学生的表格包含ID, Name, Batch, Departmentroll 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中的先前条目)?

1 个答案:

答案 0 :(得分:1)

你需要做两件事:

  1. 创建一个表格来保存您已经发出的滚动号码 - 如下所示:

    CREATE TABLE dbo.RollNumbers
    (
       ID INT IDENTITY(1,1) NOT NULL PRIMARY KEY CLUSTERED,
       RollYear INT,
       DepartmentID CHAR(2),
       LastRollNo INT
    )
    

    此表格将保留每个LastRollNoRollYear的最新发布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 
    
  3. 现在您可以在插入数据之前调用此存储过程,并返回下一个要使用的卷号:

    DECLARE @NextRollNo INT
    
    EXEC @NextRollNo = dbo.GetRollNo @Year = 2014, @DeptId = 'CE'
    
    SELECT @NextRollNo
    

    并且瞧 - 您的下一个,有效RollNo给定(Year, DeptId),您可以在INSERT

    中使用它