首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自动增量Sql查询

自动增量Sql查询
EN

Stack Overflow用户
提问于 2014-01-30 10:19:15
回答 2查看 1.1K关注 0票数 1

我正在工作的案件监测系统,在其中,我需要作出查询,将自动生成案件编号。+1与上一宗案件有关。请看一下我的查询

代码语言:javascript
复制
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。

请帮帮忙

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-01-30 10:34:07

有一个建议:不要尝试手工操作。

唯一可行的解决办法是使用

  • 一个ID INT IDENTITY(1,1)列,用于使Server处理数值的自动增量
  • 一个经过计算的持久化列,以将该数值转换为所需的值。

所以试试这个:

代码语言:javascript
复制
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的值时

代码语言:javascript
复制
INSERT INTO dbo.Cases(Col1, Col2, ..., ColN)
VALUES (Val1, Val2, ....., ValN)

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

Update:如果表中有DATEDATETIME列,并且希望将该日期的最后两位数字包含在计算列中,请使用以下公式:

代码语言:javascript
复制
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()) ....,因为这会使列不确定,然后就不能再保存(存储)值了--每次访问它时都必须计算它,如果可能的话,这是我会尽量避免的。

票数 2
EN

Stack Overflow用户

发布于 2014-01-30 10:24:40

试着像这样

可以使用()生成AutoNumber

Eg:

代码语言:javascript
复制
SELECT row_number() OVER (ORDER BY casno) n,
       casno, 
FROM Table1 

编辑

代码语言:javascript
复制
SELECT *,row_number(Partition By id,CaseNo) OVER (ORDER BY id) AS CASENO
FROM tbl_RecordRequisition
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21453637

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档