经过一些搜索和阅读文档之后,很明显您可以在SQL Server中编写用户定义的函数,这些函数被标记为确定性或非确定性,具体取决于正文中使用的内置函数。
RAND()列在非确定性函数下(参见msdn article)。那么为什么我不能在函数中使用它呢?
答案 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