【问题标题】:Creating a UDF that will Accept Seeding for Rand()创建一个接受 Rand() 播种的 UDF
【发布时间】:2015-08-12 22:06:15
【问题描述】:
尝试创建以下函数时出现以下错误:
错误 1 SQL80001:'RETURN SELECT CAST(RAND(
@offset * @seed )* @max as int ) + 1'
我做错了什么?
CREATE FUNCTION [dbo].[fn_RandomInt]( @offset int, @seed int, @max int )
RETURNS INT
AS
RETURN
SELECT CAST( RAND( @offset * @seed )* @max as int ) + 1
是否可以创建一个将 SEED 接收到 Rand() 函数中的 UDF?
【问题讨论】:
标签:
sql
sql-server
tsql
visual-studio-2012
【解决方案1】:
创建函数的正确语法是:
CREATE FUNCTION [dbo].[fn_RandomInt]( @offset int, @seed int, @max int )
RETURNS INT
AS
begin
RETURN CAST( RAND( @offset * @seed )* @max as int ) + 1
end
GO
但是你会得到错误:
消息 443,级别 16,状态 1,过程 fn_RandomInt,第 5 行无效使用
函数中的副作用运算符“rand”。
这是因为您不能将不确定的函数放入 UDF 中。尽管出于某种原因,您的函数可以使用使用不确定函数的视图或过程,因此您可以创建一个带有输出变量的存储过程,该变量返回 rand 函数的值并使用它。您也可以只将rand 函数的输出发送到该函数并使用它。喜欢:
select dbo.fn_RandomInt(10, rand(@seed), 20)
另外,如果你想让你的函数返回一个介于@offset 和@max 之间的随机数,那么你的公式将不起作用。你会想要更多类似的东西:
CAST(@offset + RAND(@seed) * (@offset-@max+1) as int)
【解决方案2】:
你可以得到它不能使用这个语法的原因,这会给你这个错误。
CREATE FUNCTION [dbo].[fn_RandomInt]( @offset int, @seed int, @max int )
RETURNS INT
AS
BEGIN
DECLARE @v_offset INT, @v_seed INT, @v_max INT, @result INT
SELECT @result = CAST(RAND( @v_offset * @v_seed ) * @v_max as int ) + 1
RETURN @result
END
它会给你这个错误 -
消息 443,级别 16,状态 1,过程 RandFn,第 7 行
在函数中无效使用副作用运算符“rand”
你可以在这里寻求帮助,但你需要做一些不同的事情,因为你想提供 RAND() 参数,所以视图的想法是行不通的。
http://blog.sqlauthority.com/2012/11/20/sql-server-using-rand-in-user-defined-functions-udf/