sql - 不使用 NewID() 的 SQL 上的随机数

标签 sql sql-server tsql random

您好,我想使用以下语句生成一个唯一随机数:

Convert(int, (CHECKSUM(NEWID()))*100000) AS [ITEM] 

因为当我在“from”上使用 joins 子句时,它会使用 NEWID() 生成双寄存器

我使用 SQL Server 2000

*PD:当我使用 Rand() 时,它可能以 100000000 的概率 1 重复,但这非常关键,因此重复生成的随机值的概率必须为 0%

我的 NewID() 查询和 SELECT 语句的结果重复 (x2)
我的查询没有 NewID() 并在 SELECT 语句上使用 Rand() 是单个 (x1) 但重复生成的随机值的概率不确定但 存在!

谢谢!

最佳答案

是不是溢出了?

CAST(CHECKSUM(NEWID()) AS bigint) * CAST(100000 AS bigint) AS [ITEM]

CAST(CAST(CHECKSUM(NEWID()) AS bigint) * CAST(100000 AS bigint) % 2100000000 AS int) AS [ITEM]

编辑:

没有重复数字的可能性为 0%

CHECKSUM(NEWID())) 返回一个整数,它有 40 亿行。 birthday paradox意味着碰撞的机会当然要高得多。

Bigint(上图)或decimal(38,0)给你更多的空间,但只会减少碰撞的机会,但永远不会消除。

但仍然不明白你为什么要加入一个唯一的随机数......

关于sql - 不使用 NewID() 的 SQL 上的随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2247554/

相关文章:

SQL Server - 将存储过程从一个数据库复制到另一个数据库

mysql - 使用 DateDiff 查找 table_1.column A 和 table_2.column B 相差 <90 分钟的示例

sql-server - 无法通过 SQL Server Management Studio 连接到 SQL Server Linux Docker 容器

sql-server - MS SQl 根据行中的值创建列

sql-server - 如何让 CTE 在 T-SQL/MSSQL 中再次搜索我的数据?

sql - 根据 ID 连接值

mysql - 如何在表中迭代两次?

sql-server - 处理许多删除语句的更好方法

sql-server - 如何在 T-SQL 中聚合字符串数据

mysql - 合并 2 个 MySQL 查询