获取max + 1而不删除零

时间:2016-09-14 09:38:51

标签: sql sql-server

我有一个varchar字段,其中包含此格式的数字" 00001" ," 00002"等等 当我尝试使用Max(Field)+ 1来获取下一个数字时,我得到一个整数" 3"例如。

我如何得到结果" 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 个答案:

答案 0 :(得分:1)

为此,您需要将其转换为整数,递增,并将其转换回字符串:

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

但是......你的IDENTITY字段是整数并且允许SQL处理增量,你会好多了, 然后在需要时将其转换为前导零字符串。一种方法是使用Computed列:

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

这样,"最新价值"将在您插入行时为您创建,并且前导零sting版本将为您创建 自动创建。

答案 1 :(得分: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