首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用我在Server存储过程中提供的格式来增加数字

如何使用我在Server存储过程中提供的格式来增加数字
EN

Stack Overflow用户
提问于 2018-12-29 05:56:59
回答 2查看 167关注 0票数 0

我正在使用Server存储过程来增加自定义的数字。我有一个自动编号列,它为@LASTNUMBER变量赋值:

代码语言:javascript
运行
复制
SET @STOCK_LEDGER_NUMBER = 'SLL' + '-' + RIGHT(('0000'+ CAST((@LASTNUMBER + 1)AS VARCHAR)),4)
  • 第一个输出:'SLL-0001‘
  • 我可以返回的最后一个输出:'SLL-9999‘

使用此代码,我只能将我的号码增加到最大的9999。

当自动编号设置为10000时,此代码返回'SLL-0000‘。但是我需要显示它是'SLL-10000‘,下一个号码应该是'SLL-10001’。

请帮帮我

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-12-29 08:53:05

试试看..。它不需要任何修改就能处理任何正整数.

代码语言:javascript
运行
复制
DECLARE 
    @last_number INT,
    @digit_count INT,
    @rep_start INT,
    @stock_ledger_number VARCHAR(14);

SELECT 
    @last_number = 10000,
    @digit_count = FLOOR(LOG10(@last_number + 1) + 1),
    @rep_start = (ABS(4 - @digit_count) + (4 - @digit_count)) / 2,
    @stock_ledger_number = STUFF('SLL-0000', 5 + @rep_start, @digit_count, CONVERT(VARCHAR(10), @last_number + 1))

SELECT last_number = @last_number, stock_ledger_number = @stock_ledger_number;

结果..。

代码语言:javascript
运行
复制
last_number stock_ledger_number
----------- -------------------
10000       SLL-10001

还有其他一些例子..。

代码语言:javascript
运行
复制
last_number stock_ledger_number
----------- -------------------
1           SLL-0002

last_number stock_ledger_number
----------- -------------------
55          SLL-0056

last_number stock_ledger_number
----------- -------------------
332         SLL-0333

last_number stock_ledger_number
----------- -------------------
2018        SLL-2019

last_number stock_ledger_number
----------- -------------------
12345       SLL-12346

last_number stock_ledger_number
----------- -------------------
1234567890  SLL-1234567891

last_number stock_ledger_number
----------- -------------------
2147483646  SLL-2147483647

当然,您不局限于使用标量变量一次执行这些操作。你可以在相当大的范围内.

-与上述标量变量版本相同的逻辑,但适用于在一次执行中生成多个值。

代码语言:javascript
运行
复制
DECLARE @last_number INT = 9900;

WITH    
    cte_Tally AS (
        SELECT TOP (15000)
            n = ROW_NUMBER() OVER (ORDER BY o1.object_id) + @last_number
        FROM
            sys.objects o1
            CROSS JOIN sys.objects o2
        )
SELECT 
    STOCK_LEDGER_NUMBER = CONVERT(VARCHAR(14), STUFF('SLL-0000', 5 + rs.rep_start, dc.digit_count, CONVERT(VARCHAR(10), t.n)))
FROM
    cte_Tally t
    CROSS APPLY ( VALUES ( CONVERT(INT, FLOOR(LOG10(t.n) + 1))) ) dc (digit_count)
    CROSS APPLY ( VALUES ((ABS(4 - dc.digit_count) + (4 - dc.digit_count)) / 2) ) rs (rep_start);
GO 
票数 1
EN

Stack Overflow用户

发布于 2018-12-29 07:03:13

如果要支持五位数字,只需将代码行更改为:

代码语言:javascript
运行
复制
SET @STOCK_LEDGER_NUMBER = 'SLL' + '-' + RIGHT(('00000'+ CAST((@LASTNUMBER + 1) AS VARCHAR(5))), 5)
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53967094

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档