2016-09-14 22 views
-2

我有一個varchar字段包含這種格式「00001」,「00002」等數字 當我試圖通過使用最大(字段)+ 1獲得下一個數字,我得到例如整數「3」。獲取最大值+ 1而不刪除零

如何獲得結果「00003」而不是「3」?

這裏有一個工作的例子中,我只是隨它去,但我覺得有必須有一個更簡單的方法:

SELECT TOP (1) 
    { fn REPEAT(0, LEN(ItemId) - LEN(MAX(ItemId) + 1)) } + 
         CAST(MAX(ItemId) + 1 AS varchar(7)) AS Expr1 
FROM Items 
GROUP BY ItemId 
ORDER BY ItemId DESC 

的最後一個查詢給出正確的結果「0004916」

+2

真正的考驗是什麼,你應該得到'00009','00010'或'000010'? – dasblinkenlight

+0

[在SQL Server中通過填充前導零來格式化數字]可能的重複(http://stackoverflow.com/questions/9520661/formatting-numbers-by-padding-with-leading-zeros-in-sql-server) – qxg

回答

1

要做到這一點,您需要將其轉換爲整數,然後將其轉換回字符串:

SELECT RIGHT('00000'+ CONVERT(VARCHAR,MAX(CONVERT(INT,Field))+ 1),5 )FROM MyTable

但是...你有更好的IDENTITY字段是整數,並讓SQL處理增量, 然後在需要時將其轉換爲前導零字符串。一種方法是使用計算列:

CREATE TABLE [dbo].[MyTable](
    [Id] [int] IDENTITY(1,1) NOT NULL, 
    [Field] AS (RIGHT('00000'+CONVERT([VARCHAR],[Id],(0)),(5))), 
    [Desc] [nchar](10) NOT NULL 
) ON [PRIMARY] 
GO 

這樣一來,「最新值」會爲你當你插入一行,以及領先的零刺痛versionwill是 自動創建創建。

0

檢查下面的例子,它可以幫助你:

DECLARE @tbl1 AS TABLE 
(
    ComputerName VARCHAR(5), 
    CodeNumber INT 
) 

INSERT INTO @tbl1 VALUES('0001',221) 
INSERT INTO @tbl1 VALUES('0002',221) 
INSERT INTO @tbl1 VALUES('0003',221) 

SELECT 
    REPLICATE 
    (
     '0', 
     4-LEN(MAX(CAST(ComputerName as INT))) 
    ) + 
    CAST(MAX(CAST(ComputerName as INT))+1 AS VARCHAR(5)) 
FROM @tbl1 
GROUP BY CodeNumber