我有一个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"
答案 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