mssql里怎么搞随机数位数,顺便说说那些小技巧和注意点
- 问答
- 2026-01-14 15:31:16
- 3
关于在MSSQL里生成随机数以及控制它的位数,这里面有不少可以直接用的小方法和需要注意的地方,下面我就直接说说怎么操作和一些实用的技巧。
最基础的随机数:RAND()函数
在MSSQL里,生成随机数最常用的就是RAND()函数了(根据微软官方文档,RAND函数返回一个介于0到1之间(不包括1)的伪随机浮点值),你直接跑一句SELECT RAND(),它会给你一个像0.715436658这样的随机小数。
生成指定范围的整数
光有小数字不行,我们经常需要的是整数,比如1到100之间的随机数,这时候可以配合一些数学计算,公式一般是这样的:
FLOOR(RAND() * (上限 - 下限 + 1)) + 下限
FLOOR函数的作用是向下取整。
举个例子,想要1到100的随机整数,就这么写:
SELECT FLOOR(RAND() * 100) + 1
这里解释一下:RAND()产生0到1的数,乘以100就得到0到100(不包括100)的数。FLOOR去掉小数部分,得到0到99的整数,1,就变成了1到100。
控制随机数的位数
你问的“随机数位数”,通常指的是生成一个固定位数的随机数字串,比如一个6位数的验证码。
思路很简单:先生成一个足够大的随机数,然后把它格式化成固定的位数,不够的就用0在左边补足,这里要用到RIGHT()函数和字符串拼接。
比方说,生成一个6位随机数:
SELECT RIGHT('000000' + CAST(FLOOR(RAND() * 1000000) AS VARCHAR(6)), 6)
我们来拆解一下:
RAND() * 1000000:生成0到1000000(不包括)的随机小数。FLOOR(...):取整,得到0到999999之间的整数。CAST(... AS VARCHAR(6)):把整数转换成字符串,不然没法进行字符串操作。'000000' + ...:在字符串前面拼上6个0,如果生成的数是123,拼完就是“000000123”。RIGHT(..., 6):从这个长字符串的最右边取6位,对于“000000123”,取右边6位就是“000123”,这样就保证了如果数字不足6位,前面会用0补全。
另一个选择:NEWID()函数的妙用

RAND()函数有个特点:在同一条查询语句中,如果多次调用RAND(),而且没给它不同的种子值,它返回的值可能是一样的,这时候,可以用NEWID()函数来帮忙(根据SQL Server的机制,NEWID函数会创建一个唯一的标识符值,这个值本身是随机的)。
利用NEWID()的随机性,可以这样生成随机数:
SELECT ABS(CHECKSUM(NEWID()))
CHECKSUM()函数会返回NEWID()的校验和值,这个值是一个整数,而且每次都不一样。ABS()是取绝对值,确保是正数。
用这个方法生成固定范围的随机数更简单,比如0到99:
SELECT ABS(CHECKSUM(NEWID())) % 100
是取模运算符,意思是除以100取余数,结果自然在0到99之间。
生成6位随机数串也可以用它:
SELECT RIGHT('000000' + CAST(ABS(CHECKSUM(NEWID())) % 1000000 AS VARCHAR(6)), 6)
这种方法通常比RAND()的随机性更好,尤其是在需要每行都产生不同随机数的时候。
一些实用小技巧和重要注意点
-
随机排序(打乱顺序) 这是一个非常常见的需求,比如随机抽取10条记录,用
NEWID()很方便:SELECT TOP 10 * FROM 你的表名 ORDER BY NEWID()这样每次查询结果的顺序都是随机的。 -
RAND()函数的种子值RAND()函数可以接受一个种子参数,像这样RAND(5),如果指定了相同的种子,每次生成的随机数序列是完全一样的,这在需要重现特定随机序列的测试场景下有用,但如果你要的是“真”随机,就不要指定种子。
-
性能考虑 在数据量非常大的表上使用
ORDER BY NEWID()来随机排序,可能会比较慢,因为它是为每一行都生成一个GUID,然后进行全表排序,对于大数据集,可以考虑其他方法,比如先获取总行数,然后随机一个偏移量,再用OFFSET FETCH来取数据(适用于SQL Server 2012及以后版本)。 -
随机性不是真正的随机 必须明白,无论是
RAND()还是NEWID(),都是“伪随机”算法生成的,对于一般的业务需求(如抽奖、随机展示、生成验证码)完全够用,但如果你需要用于密码学或安全级别非常高的场景,这就不合适了,应该在应用程序层面使用更安全的随机数生成器。 -
小数位数的控制 如果你需要指定位数的小数,比如生成一个带两位小数的随机金额,可以这样:
SELECT CAST(RAND() * 100 AS DECIMAL(10,2))这会生成一个像56.78这样的数。DECIMAL(10,2)表示总共10位数,其中2位是小数。 -
避免重复的技巧 有时候你可能需要在一段时间内生成不重复的随机数,单纯靠SQL本身很难保证绝对不重复,常见的做法是生成后去数据库里查询是否已存在,如果存在就再生成一次,或者,可以结合时间戳、序列号等元素来降低重复概率。
在MSSQL里搞随机数,核心就是RAND()和NEWID()这两个函数,控制位数主要靠字符串函数和数学计算,根据不同的场景(比如是要随机数还是随机排序,数据量大小)选择合适的方法,并了解它们的局限性,这样就能应对大多数需求了。
本文由召安青于2026-01-14发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:http://waw.haoid.cn/wenda/80625.html
