在 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))
(或BIGINT
和8
,你的返回类型和表达式相互矛盾)。
@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 中创建生成随机数函数的主要内容,如果未能解决你的问题,请参考以下文章