【问题标题】:Stored procedure for auto generating roll no?自动生成卷号的存储过程?
【发布时间】:2014-06-05 10:07:28
【问题描述】:

伙计们,我有一个用于将新学生添加到数据库的存储过程。将学生添加到的表具有 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

我希望你从上面的例子中明白了……现在我该怎么做呢?我可以连接批处理 + 离开,但我应该如何增加卷号(基于 db 中的先前条目)?

【问题讨论】:

  • 你有一个年份列,但你想把年份放在参数中。
  • 批次基本是年

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


【解决方案1】:

你需要做两件事:

  1. 创建一个表格来保存您已经给出的卷号 - 如下所示:

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

    此表将保存每个RollYearDeptId 的最后发布的LastRollNo 号码。

  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 中使用它

【讨论】:

  • 非常感谢您提供如此详细的答案!我只有一个问题。如何在 SQL Server 中连接? '+' 似乎不起作用...
  • @NewbieProgrammer: + 有效 - 但您可能需要将 INT 转换为 VARCHAR(x) : CAST(@NewRollNo AS VARCHAR(10)) + ....
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-24
  • 1970-01-01
相关资源
最近更新 更多