2014-01-30 76 views
1

我正在處理案件監控系統,其中我需要做出查詢,這將自動生成案例號。輸入前一個案例的+1。請看看我的查詢自動遞增Sql查詢

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

你只提取最後兩個挖掘的CaseNo'右其((CaseNo),2)' – MauriDev

+0

是的,我知道,但如果我使用3它給該誤差變換將varchar值「4/9」爲數據類型int時 –

+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/00001值, A/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()) ....將使列不確定性,然後你不能堅持(店)的值了 - 它會在每次訪問時間來計算的,這是我會盡量避免,如果以往任何時候都可能

+0

感謝馬克你的解決方案工作:),但我想插入一年和A之間的最後兩位數字。你會告訴我該怎麼做 –

+0

@ankitsrist:如果你的表中有'DATE'列,那麼我的迴應就會更新,如果你的表中有'DATE'列的話(在我的例子中,我*猜到了*它可能被稱爲' CaseDate' - 適應任何你真正擁有的) –

+0

非常感謝你marc :) –

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 
+0

你會根據你的修改我的查詢 –

+0

你可以給我表和模式 –

+0

CREATE TABLE [dbo]。[tbl_RecordRequisition]( \t [ID] [INT] IDENTITY(1,1)NOT NULL, \t [CaseNo] [VARCHAR(50)NULL, \t [RequNo] [INT] NULL, \t [COMPNAME] [ VARCHAR(50)NULL, \t [RespName] [VARCHAR(50)NULL, \t [FILEDATE] [VARCHAR(50)NULL, \t [NextDate] [VARCHAR(50)NULL, \t [DateOfFilling ] [varchar](50)NULL, \t [區域代碼] [varchar](50)NULL) –