9

After a bit of searching and reading the documentation, it's clear that you can write user defined functions in SQL Server that are marked as either deterministic or nondeterministic depending on which built-infunctions are used within the body.

RAND() is listed under the nondeterministic functions (see msdn article). So why can't I use it in a function?

4

3 回答 3

19

使用视图可能对您有用。
选择语句返回随机数

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
于 2010-08-20T13:58:03.433 回答
13

因为它有副作用。

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

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

于 2010-08-20T13:55:12.810 回答
4

我发现这个解决方案不会创建视图:

基本上:

代替

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

于 2016-04-19T19:12:36.467 回答