在 SQL Server 中创建生成随机数函数

Posted

技术标签:

【中文标题】在 SQL Server 中创建生成随机数函数【英文标题】:Create generate random number function in SQL Server 【发布时间】:2019-07-09 10:53:49 【问题描述】:

我正在尝试在 SQL Server 中创建函数。在这个函数中,我生成了随机数,但没有生成函数。

Create function [GetRandomNumber]
(
)
RETURNS bigint
as 
Begin
Declare @randomNo int
 set  @randomNo = (select round(rand(checksum(newid()))*(10001)+50000,0) as [GetRandomNumber])
 return @randomNo
End

这是在以下错误中生成的:

在函数中无效使用副作用运算符“newid”。 消息 443,级别 16,状态 1,过程 GetRandomNumber,第 8 行 在函数中无效使用副作用运算符“rand”。

【问题讨论】:

正如消息所说,你不能那样做。传入 newid() 作为参数 除 CLR 函数外,用户定义的函数必须是确定性的。出于这个原因,你不能编写一个函数来产生一个随机数。你可以编写一个存储过程来这样做——或者你可以只使用CONVERT(INT, CRYPT_GEN_RANDOM(4))(或BIGINT8,你的返回类型和表达式相互矛盾)。 @JeroenMostert 没有任何方法我必须在函数中创建生成随机数。 那么你唯一的办法(如果你不想要像传入非确定性部分这样的hacky半解决方案,这很容易出错)是一个非确定性CLR function,如上所述前。不过,构建和安装这些并不是一件容易的事(但作为奖励,在 C# 中生成一个范围内的良好随机数要容易得多)。 是的,我写了一个存储过程,但我只是尝试一下 【参考方案1】:

你可以。不过,这需要一些额外的跑腿工作。

首先,您需要创建一个视图,如下所示:

create view dbo.sys_NDF
as
select rand() as [ValueRand], newid() as [ValueGUID],
  rand(checksum(newid())) as [SeededRand];
go

诀窍是您不能直接从您的 UDF 调用这些系统函数,但是您可以查询返回其值的视图。如果需要,您以后可以使用其他功能/列对其进行扩展。

因此,您的函数开始如下所示:

Create function [GetRandomNumber]()
RETURNS bigint as begin
return (select round(v.SeededRand * 10001 + 50000, 0) from dbo.sys_NDF v);
end;
go

【讨论】:

我只是检查功能是否可能这样做。【参考方案2】:

创建 SP 而不是函数。因为用户定义的函数中不允许某些系统函数。

CREATE PROCEDURE  [GetRandomNumber]
as 
Begin
Declare @randomNo int
 set  @randomNo = (select round(rand(checksum(newid()))*(10001)+50000,0) as [GetRandomNumber])
 return @randomNo
End

GO
 DECLARE @returnvalue INT
 EXEC @returnvalue = GetRandomNumber
 SELECT @returnvalue

【讨论】:

问题是你不能OUTER APPLY到一个存储过程。

以上是关于在 SQL Server 中创建生成随机数函数的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server生成指定范围内的随机数

在 C# 中创建加密随机数的最快、线程安全的方法?

如何使用图像视图从图像数组中创建随机图像生成器?

在Python中创建生成稀疏矩阵(均匀分布高斯分布)

在Python中创建生成稀疏矩阵(均匀分布高斯分布)

在 Python 中创建随机整数列表