我有以下脚本,它生成 1.75 亿(!)个格式为“ABC-1234”的唯一字母数字代码,范围从 AAA-0000 到 ZZZ-9999。
在我专用的 MS SQL 2016 机器上按原样运行此脚本需要 20 个小时。加快速度的最佳方法是什么?从脚本中可以看出,我的 SQL 技能有些欠缺!
有一个标识 (int) 列、ID 和 CODE (nvarchar(20)) 本身的列。两列组成主键:
CREATE TABLE [dbo].[ORDERED_CODES](
[ID] [int] NOT NULL,
[Code] [nvarchar](20) NOT NULL,
CONSTRAINT [PK_ORDERED_CODES] PRIMARY KEY CLUSTERED
(
[ID] ASC,
[Code] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
脚本:
DECLARE @Alpha1 INT;
DECLARE @Alpha2 INT;
DECLARE @Alpha3 INT;
DECLARE @Num INT;
-- alpha elements 'ABC'
SET @Alpha1 = 65;
SET @Alpha2 = 65;
SET @Alpha3 = 65;
-- number element '9999'
SET @Num = 0;
-- temporary holders
DECLARE @FINALCODE Nvarchar(50);
DECLARE @CODE1 Nvarchar(50);
DECLARE @CODE2 Nvarchar(50);
DECLARE @CODE3 Nvarchar(50);
WHILE @Alpha1 < 91
BEGIN
SET @CODE1 = CHAR(@Alpha1)
WHILE @Alpha2 < 91
BEGIN
SET @CODE2 = @CODE1 + CHAR(@Alpha2)
SET @Alpha2 = @Alpha2 +1
WHILE @Alpha3 < 91
BEGIN
SET @CODE3 = @CODE2 + CHAR(@Alpha3)
SET @Alpha3 = @Alpha3 +1
WHILE @Num < 10000
BEGIN
SET @FINALCODE = RIGHT('0000'+ CAST(@Num as nvarchar(4)),4) + CHAR(45) + @CODE3
SET @Num = @Num +1
INSERT INTO ORDERED_CODES (CODE) VALUES (@FINALCODE)
END
SET @FINALCODE = null
SET @Num = 0
END
SET @Alpha3 = 65
END
SET @Alpha2 = 65
SET @Alpha1 = @Alpha1 +1
END;
任何和所有的想法都非常感谢!
最佳答案
我会这样做:
with alphas as (
select v.ch
from (values ('A'), ('B'), . . .
) v(ch)
),
digits as (
select v.ch
from values ('0'), ('1'), . . .
)
select (a1.ch + a2.ch + a3.ch + d1.ch + d2.ch + d3.ch + d4.ch) as code
from alphas a1 cross join
alphas a2 cross join
alphas a3 cross join
digits d1 cross join
digits d2 cross join
digits d3 cross join
digits d4;
。 . .
用于您想要的有效字符。如果您愿意,可以使用 values
以外的方法生成值。
关于sql - 如何加速创建大型字母数字代码表的 SQL 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45692746/