代码之家  ›  专栏  ›  技术社区  ›  BG100

使用RAND()在SQL Server中创建不确定函数

  •  9
  • BG100  · 技术社区  · 14 年前

    在仔细搜索和阅读文档之后,很明显,您可以在SQL Server中编写用户定义的函数,这些函数被标记为确定性函数或非确定性函数,具体取决于主体中使用的是哪个内置函数。

    RAND()列在非确定性函数下(请参见 msdn article

    3 回复  |  直到 14 年前
        1
  •  13
  •   Martin Smith    14 年前

    因为它有副作用。

    函数中不允许有副作用的构造。它的副作用是改变一些内部状态来跟踪最后一个事件 rand() 发行价值。

        2
  •  19
  •   Lieven Keersmaekers    13 年前

    使用视图可能适合您。
    Returning Random Numbers from a select statement

    CREATE VIEW vRandNumber
    AS
    SELECT RAND() as RandNumber
    

    视图是必要的,因为正如您已经发现的那样,UDF不能使用rand()函数,因为这会使函数不确定。您可以通过使用视图来欺骗UDF以接受随机数。

    CREATE FUNCTION RandNumber()
    RETURNS float
    AS
      BEGIN
      RETURN (SELECT RandNumber FROM vRandNumber)
      END
    

    最后,您可以在任何SELECT中使用此函数,以返回每行0到1之间的随机数:

    SELECT dbo.RandNumber(), *
    FROM Northwind..Customers
    
        3
  •  4
  •   SqlZim    7 年前

    solution 不会创建视图:

    基本上:

    而不是

    SET @R = Rand()
    

    SET @R = ABS(CHECKSUM(PWDENCRYPT(N''))) / 2147483647.0
    

    我想要一个介于1和10之间的数字:

    ROUND(((10 - 1 -1) * ( ABS(CHECKSUM(PWDENCRYPT(N''))) / 2147483647.0) + 1), 0))
    
    ROUND(((@max - @lower -1) * ( ABS(CHECKSUM(PWDENCRYPT(N''))) / 2147483647.0) + @lower), 0))
    

    Using (Or Simulating) Rand() In A T-Sql User-Defined Function