Sql server 我想基于sql存储过程中以前的id生成新id

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

我有一张表,将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(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即可。