【问题标题】: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/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-11
      • 2015-09-15
      • 1970-01-01
      • 2012-10-24
      • 1970-01-01
      • 2011-04-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多