生成范围内的随机数字、字母或字符



我正在进行SQL Server的数据匿名化。

我有这3个公式,可以帮助我创建我想要的:

SELECT CHAR(cast((90 - 65) * rand() + 65 AS INTEGER)) -- only letters
SELECT CAST((128 - 48) * RAND() + 48 AS INTEGER) -- only numbers
SELECT CHAR(CAST((128 - 48) * RAND() + 48 AS INTEGER)) -- letters, numbers, symbols

但是,这只能创建1个数字11个字母,或1个符号

我希望有自由,允许我创建一个随机字符串或长度的数字,我想要。类似于3个或5个数字三个或五个字母数字、字母或符号之间的三个或5

我还发现了一些非常接近我想要的东西:

SELECT LEFT(CAST(NEWID() AS VARCHAR(100)), 3) -- letters and numbers 

这是一个非常聪明的想法,因为它使用NEWID(),它允许我创建一个长度为我想要的数字和字母的随机序列(在本例中为3(。但符号却不见了。

我需要3种不同的SELECT:

  • 一只代表数字
  • 一个仅用于字母
  • 一个用于数字、字母和符号

可以自由选择数据长度。

完整的解决方案需要一些工作,但如果您仍然需要,以下是您可能想要进一步试验的想法的工作原理:

declare @type varchar(10)='letters', @length tinyint=5;
with chars as (
select top(59) 31 + Row_Number() over (order by (select 1)) n from master.dbo.spt_values
), s  as (
select top (@length) Char(n.n) c
from chars n
where @type='all' 
or (@type='symbols' and n between 33 and 47)
or (@type='numbers' and n between 48 and 57)
or (@type='letters' and n between 65 and 90)
order by newid()
)
select String_Agg(s.c,'') 
from s

递归查询可以使用rand((函数:

declare @desiredlength tinyint=5;
With builder As (
Select *
From (Values (0, '', 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789')) initial (length, randstr, pool)
Union All
Select length+1, randstr + substring(pool,cast(rand()*len(pool)+1 AS int),1), pool
From builder
Where length<@desiredlength
)
Select randstr From builder
Where length=@desiredlength

单个select中的rand((在select的每一行中返回相同的随机数。但在递归选择中,您处于灰色区域,每个递归都可能被视为一个单独的查询。

显然,您可以将池定义定制为您想要的任何字符集,其余代码将从其中进行选择。

最新更新