创建一个接受Rand的播种的UDF()

时间:2015-08-12 22:06:15

标签: sql sql-server tsql visual-studio-2012

尝试创建以下功能时出现以下错误:

  

错误1 SQL80001:返回选择后的语法不正确(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?

2 个答案:

答案 0 :(得分:0)

创建函数的正确语法是:

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)

答案 1 :(得分:-1)

你可以得到它不会使用这种语法的原因,这会给你这个错误。

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

它会给你这个错误 - Msg 443,Level 16,State 1,Procedure RandFn,Line 7 在函数

中无效使用副作用运算符'rand'

你可以在这里寻求帮助,但是你需要做一些不同的事情,因为你想要提供RAND()参数,所以视图的想法是行不通的。

http://blog.sqlauthority.com/2012/11/20/sql-server-using-rand-in-user-defined-functions-udf/