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

时间:2010-08-20 13:49:36

标签: sql function non-deterministic

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

RAND()列在非确定性函数下(参见msdn article)。那么为什么我不能在函数中使用它呢?

3 个答案:

答案 0 :(得分:19)

使用视图可能对您有用。
来自Returning Random Numbers from a select statement

CREATE VIEW vRandNumber
AS
SELECT RAND() as RandNumber

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

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

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

SELECT dbo.RandNumber(), *
FROM Northwind..Customers

答案 1 :(得分:13)

因为它有副作用。

函数中不允许带有副作用的构造。它的副作用是改变一些内部状态,以跟踪发布的最后rand()值。

我认为您可以通过将其包含在View定义中然后从View中选择来解决它。

答案 2 :(得分:3)

我发现这个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