我正在研究案例监控系统,我需要进行查询,这将自动生成案例号。输入前一个案例的+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。
请帮助
答案 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
中插入一行而未指定ID
或CaseID
的值时:
INSERT INTO dbo.Cases(Col1, Col2, ..., ColN)
VALUES (Val1, Val2, ....., ValN)
然后SQL Server将自动且安全地增加ID
值,而CaseID
将包含A/00001
,A/00002
等值。 ....等等 - 自动,安全,可靠,无重复。
更新:如果表格中有DATE
或DATETIME
列,并且您希望将该日期年份的最后两位数字包含在计算列中,使用这个公式:
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