自动递增Sql查询

时间:2014-01-30 10:19:15

标签: sql sql-server-2008

我正在研究案例监控系统,我需要进行查询,这将自动生成案例号。输入前一个案例的+1。请查看我的查询

select  'A/' +right(cast(year(GETDATE()) as CHAR(4)), 2)+'/'+ + cast(max(right((CaseNo), 2) )+1 as varchar(50))as caseno from tbl_RecordRequisition

它工作正常,但在案件没有。 100它没有递增到101。

请帮助

2 个答案:

答案 0 :(得分:2)

一句忠告:不要试图手动执行此操作。

唯一可行的解​​决方案是使用

  • ID INT IDENTITY(1,1)列,以使SQL Server处理数值的自动增量
  • 计算的,持久的列,将该数值转换为您需要的值

所以试试这个:

CREATE TABLE dbo.Cases
  (ID INT IDENTITY(1,1) NOT NULL PRIMARY KEY CLUSTERED,
   CaseID AS 'A/' + RIGHT('00000' + CAST(ID AS VARCHAR(5)), 5) PERSISTED,
   .... your other columns here....
  )

现在,每次在Cases中插入一行而未指定IDCaseID的值时:

INSERT INTO dbo.Cases(Col1, Col2, ..., ColN)
VALUES (Val1, Val2, ....., ValN)

然后SQL Server将自动且安全地增加ID值,而CaseID将包含A/00001A/00002等值。 ....等等 - 自动,安全,可靠,无重复。

更新:如果表格中有DATEDATETIME列,并且您希望将该日期年份的最后两位数字包含在计算列中,使用这个公式:

CREATE TABLE dbo.Cases
  (ID INT IDENTITY(1,1) NOT NULL PRIMARY KEY CLUSTERED,
   CaseDate DATE DEFAULT(GETDATE()),
   CaseID AS 'A/' + CAST(YEAR(CaseDate) AS VARCHAR(2)) + '/' + 
             RIGHT('00000' + CAST(ID AS VARCHAR(5)), 5) PERSISTED,
   ... (other columns) .....
  )

你不能使用CAST(YEAR(GETDATE()) ....,因为这会使列不确定,然后你不能再保存(存储)该值 - 每次访问它时都必须计算它,这是我想要的尽量避免使用

答案 1 :(得分:1)

试试这个

您可以使用row_number()生成自动编号

<强>例如

SELECT row_number() OVER (ORDER BY casno) n,
       casno, 
FROM Table1 

修改

SELECT *,row_number(Partition By id,CaseNo) OVER (ORDER BY id) AS CASENO
FROM tbl_RecordRequisition