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

BG1*_*100 9 sql function non-deterministic

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

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

Lie*_*ers 19

使用View可能对您有用.
select语句中返回随机数

CREATE VIEW vRandNumber
AS
SELECT RAND() as RandNumber
Run Code Online (Sandbox Code Playgroud)

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

CREATE FUNCTION RandNumber()
RETURNS float
AS
  BEGIN
  RETURN (SELECT RandNumber FROM vRandNumber)
  END
Run Code Online (Sandbox Code Playgroud)

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

SELECT dbo.RandNumber(), *
FROM Northwind..Customers
Run Code Online (Sandbox Code Playgroud)

  • +1对于视图技巧.我也记得那件事.但这不是因为决定论.函数中允许使用`getdate()`.显然,在需要确定性函数的情况下不能使用该函数,例如持久计算列.这是因为副作用.引发的错误是"在函数中无效使用副作用运算符'rand'." (4认同)

Mar*_*ith 13

因为它有副作用.

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

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