MSSQL:从前缀号生成 8 位序列号/条形码号

Mis*_*ish 5 sql-server t-sql substring

我面前有一项复杂的任务,我真的可以用你的一些大脑来帮助我。

在我的工作中,我们有一个存储条形码数字的数据库。该表包含 6 位数字作为 8 位条形码的前缀,我们目前是否在 Excel 中手动计算条形码的最后 2 位数字。

以下是我们如何手动计算最后 2 位数字的步骤:

条码前缀示例:

declare @prefix int
set @prefix = 573071
Run Code Online (Sandbox Code Playgroud)

1)每个前缀应生成 10 次,其中第 7 位数字从 0 自动递增到 9

5730710
5730711
5730712 
5730713
5730714
5730715
5730716
5730717
5730718
5730719
Run Code Online (Sandbox Code Playgroud)

2)加上第 7 位数字后,我们使用以下公式计算每行的第 8 位数字:

  • 首先我们开始计算第一行((5730710)。然后我们开始计算第一,第三,第五,第七位并乘以3并将它们加在一起

    5730710:
    5 x 3     
    3 x 3     
    7 x 3     
    0 x 3 
    
    Run Code Online (Sandbox Code Playgroud)
  • 然后我们取第二、四、六位数字乘以 1 并将它们加在一起:

    7 x 1
    0 x 1
    1 x 1
    
    Run Code Online (Sandbox Code Playgroud)
  • 我们使用 SUM (45 + 7 = 53) 将两个结果相加

  • 然后我们53 向上舍入到最接近的 10(仅向上),在这种情况下它必须是 60

    DECLARE @num int = 53;
    SELECT @num + (10 - (@num % 10)); = 60
    
    Run Code Online (Sandbox Code Playgroud)
  • 在我们向上舍入后,我们用原始值减去向上舍入值:(60 - 53 = 7)

....最后我们从 6 位前缀生成了一个 8 位条形码:结果:57307107

所以我的问题是,我如何通过 sql 做到这一点?

这是我如何计算第 8 位数字:

declare @prefix int
set @prefix = 5730710
Select 
(
SUBSTRING(cast(@prefix as varchar), 1,1 )*3
+
SUBSTRING(cast(@prefix as varchar), 3,1 )*3
+
SUBSTRING(cast(@prefix as varchar), 5,1 )*3
+
SUBSTRING(cast(@prefix as varchar), 7,1 )*3
+
SUBSTRING(cast(@prefix as varchar), 2,1 )*1
+
SUBSTRING(cast(@prefix as varchar), 4,1 )*1
+
SUBSTRING(cast(@prefix as varchar), 6,1 )*1
) 
+ 
(10 - ((
SUBSTRING(cast(@prefix as varchar), 1,1 )*3
+
SUBSTRING(cast(@prefix as varchar), 3,1 )*3
+
SUBSTRING(cast(@prefix as varchar), 5,1 )*3
+
SUBSTRING(cast(@prefix as varchar), 7,1 )*3
+
SUBSTRING(cast(@prefix as varchar), 2,1 )*1
+
SUBSTRING(cast(@prefix as varchar), 4,1 )*1
+
SUBSTRING(cast(@prefix as varchar), 6,1 )*1
)%10))

-
(
SUBSTRING(cast(@prefix as varchar), 1,1 )*3
+
SUBSTRING(cast(@prefix as varchar), 3,1 )*3
+
SUBSTRING(cast(@prefix as varchar), 5,1 )*3
+
SUBSTRING(cast(@prefix as varchar), 7,1 )*3
+
SUBSTRING(cast(@prefix as varchar), 2,1 )*1
+
SUBSTRING(cast(@prefix as varchar), 4,1 )*1
+
SUBSTRING(cast(@prefix as varchar), 6,1 )*1
)
Run Code Online (Sandbox Code Playgroud)

但是我仍然缺少如何自动生成从 0 到 9 的第 7 位数字并将其放入上述公式中,最后一旦计算出第 7 位和第 8 位数字,我需要将它们添加到前缀中以最终查看最终结果8 位条码。

Aki*_*ina 6

DECLARE @prefix INT;
SET @prefix = 573071;
WITH 
cte1 AS (SELECT 0 num
         UNION ALL
         SELECT num+1 FROM cte1 WHERE num < 9)
SELECT num, 
@prefix*100+num*10+9-((@prefix/100000+(@prefix/1000)%10+(@prefix/10)%10+num)*3+((@prefix/10000)%10+(@prefix/100)%10+@prefix%10)-1)%10 barcode
FROM cte1;
Run Code Online (Sandbox Code Playgroud)

小提琴

没有变量声明的选项:

WITH 
cte0 AS (SELECT 573071 AS prefix),
cte1 AS (SELECT 0 num
         UNION ALL
         SELECT num+1 FROM cte1 WHERE num < 9)
SELECT num, 
prefix*100+num*10+9-((prefix/100000+(prefix/1000)%10+(prefix/10)%10+num)*3+((prefix/10000)%10+(prefix/100)%10+prefix%10)-1)%10 barcode
FROM cte0, cte1;
Run Code Online (Sandbox Code Playgroud)