在SQL Server中生成新的事务ID

时间:2018-08-17 12:38:05

标签: sql sql-server

我有一个用于生成事务ID的SQL查询。我正在从当前字符串中提取最后3位数字,并增加1。

示例:

如果

--> 001 Then 002
--> 123 Then 124

查询我尝试过的内容,

DECLARE @TransactionId NVARCHAR(100)

SET @TransactionId= CONVERT(nvarchar,(SELECT SUBSTRING('PM16520001', 8, 10)))

SELECT @TransactionId as TranId
SET @TransactionId = CONVERT(Nvarchar,@TransactionId + 1)


SELECT @TransactionId as TranId

实际结果:

2

预期结果:

002

2 个答案:

答案 0 :(得分:1)

您主要关心的是将结果填充0。

在数字上执行此操作的最快方法是将最大填充值与强制转换的结果连接为最大填充

使用以下内容:

Right('00' + cast(result as varchar(3)), 3)

答案 1 :(得分:1)

这将覆盖后三位数字。 该过程会将最后三位数字强制转换为INT,然后检查其长度以确定要输入多少个前导零。

DECLARE @TransactionId NVARCHAR(100)

SET @TransactionId= CONVERT(NVARCHAR,(SELECT SUBSTRING('PM16520001', 8, 10)))

SELECT
@TransactionId =  
    CASE 
        WHEN LEN(CAST(RIGHT(@TransactionId, 3) AS INT)) = 1 
        THEN '00' + CAST(CAST(RIGHT(@TransactionId, 3) AS INT) + 1 AS NVARCHAR)
        WHEN LEN(CAST(RIGHT(@TransactionId, 3) AS INT)) = 2 
        THEN '0' + CAST(CAST(RIGHT(@TransactionId, 3) AS INT) + 1 AS NVARCHAR)
        ELSE CAST(CAST(RIGHT(@TransactionId, 3) AS INT) + 1 AS NVARCHAR)
    END 


SELECT @TransactionId as TranId

因此,如果交易ID为PM16520001,则输出应为002,如果交易ID为PM16520015,则输出应为016,并且如果交易id为PM16520305,输出应为306,依此类推。

如果这是一项业务需求,我建议使用标量函数来构建一个在整个系统中重用时更加灵活的函数。同样,这将带来一个优点,即在需要的地方随时添加,修改逻辑以应用于任何地方。