3

我想创建在 sql 中返回 1000 到 10000 之间的随机数的函数

我创造了这个

 create function dbo.RandomPass()
RETURNS int
 as
    begin
    DECLARE @RETURN int
    DECLARE @Upper INT;
    DECLARE @Lower INT;
    DECLARE @Random float;
    set @Random=RAND();

      SET @Lower = 1000 
      SET @Upper = 9999 
      set @RETURN= (ROUND(((@Upper - @Lower -1) * @Random + @Lower), 0))

 return @RETURN
 end;

但我得到这个错误

Invalid use of a side-effecting operator 'rand' within a function.
4

2 回答 2

4

在 UDF 中直接不允许使用 RAND() 函数,因此我们必须找到替代方法来使用相同的函数。这可以通过创建一个使用 RAND() 函数的 VIEW 并在 UDF 中使用相同的 VIEW 来实现。

尝试以下查询:

CREATE VIEW rndView
AS
SELECT RAND() rndResult
GO


create function dbo.RandomPass()
RETURNS int
 as
    begin
    DECLARE @RETURN int
    DECLARE @Upper INT;
    DECLARE @Lower INT;
    DECLARE @Random float;

    SELECT @Random = rndResult
    FROM rndView

      SET @Lower = 1000 
      SET @Upper = 9999 
      set @RETURN= (ROUND(((@Upper - @Lower -1) * @Random + @Lower), 0))

 return @RETURN
 end;
于 2013-07-06T09:17:41.347 回答
1

要在用户定义的函数中使用随机数:

CREATE VIEW randomView
AS
SELECT RAND() randomResult
GO

该函数将返回两个整数之间的随机数:

CREATE FUNCTION randomBetween(@lower INT, @upper INT)
RETURNS INT AS 
BEGIN
    DECLARE @random DECIMAL(18,18) 
    SELECT @random = randomResult FROM randomView

    DECLARE @randomInt INT = (CONVERT(INT, (@random*1000000)+@upper) % (@upper - @lower + 1)) + @lower

    RETURN @randomInt
END 

调用函数:

DECLARE @lower INT = 1000
DECLARE @upper INT = 10000
SELECT dbo.randomBetween(@lower, @upper)
于 2015-01-02T15:03:19.567 回答