Sql server 我想基于sql存储过程中以前的id生成新id
我有一张表,将qno存储为'res/12-19/001' 我想增加1,但当我增加1时,新的qno将是res/12-19/2 我希望它是res/12-19/002 我在sql存储过程中使用以下语句:-Sql server 我想基于sql存储过程中以前的id生成新id,sql-server,tsql,stored-procedures,Sql Server,Tsql,Stored Procedures,我有一张表,将qno存储为'res/12-19/001' 我想增加1,但当我增加1时,新的qno将是res/12-19/2 我希望它是res/12-19/002 我在sql存储过程中使用以下语句:- Select top (1) @OriginalQNo=QNO from Quo order by QNO desc SET @NewQNo=RIGHT(@OriginalQNo, 3) + 1 为解决你的问题,请考虑以下问题: DECLARE @NewQNo VARCHAR(2
Select top (1) @OriginalQNo=QNO from Quo order by QNO desc
SET @NewQNo=RIGHT(@OriginalQNo, 3) + 1
为解决你的问题,请考虑以下问题:
DECLARE @NewQNo VARCHAR(20)
DECLARE @OriginalQNo VARCHAR(20)
SET @OriginalQNo = 'res/12-19/001'
SET @NewQNo = RIGHT('00' + CAST(RIGHT(@OriginalQNo, 3) + 1 AS VARCHAR), 3)
SET @NewQNo = LEFT(@OriginalQNo, LEN(@OriginalQNo) - 3) + @NewQNo
PRINT @NewQNo
为了将数字格式化为带尾随零的3位数字,只需将两个零作为字符串前置到数字的开头,然后提取最右边的三位数字,这将在本例中产生002
为了也包括问题语法的其余部分,第二行SET
将问题的起始字符(在本例中,res/12-19/
添加到完整的3位字符串之前)
输出:
res/12-19/002
假设您正在使用SQL Server 2017 试试这个:
DECLARE @OriginalQNo VARCHAR(MAX) = 'res/12-19/001';
SELECT STRING_AGG(K.NewValue, '/')
FROM
(
SELECT K.value,
K.RN,
CASE RN
WHEN 3 THEN
RIGHT(REPLICATE('0', 3) + CAST(K.value + 1 AS VARCHAR(3)), 3)
ELSE
K.value
END AS NewValue
FROM
(
SELECT value,
ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS RN
FROM STRING_SPLIT(@OriginalQNo, '/')
) AS K
) AS K;
阅读更多信息,可能重复的可能重复的可能重复的为什么要将
@OriginalQNo
转换为varchar
,然后转换为int
?您描述的似乎是序列,因为您上面的SQL将给出数字0-999。“我有一个表,它将qno存储为'res/12-19/001'。”这就是问题的根源。似乎您正在将多个数据点压缩到一个列中,这从来都不是一个好主意。您应该使用单独的列来存储单独的数据点。如果您需要此格式进行显示,只需从…选择col1+'/'+col2+'/'+col3即可。