2012-08-22 139 views
2

我希望有人能帮助我。SQL随机数用户定义函数

我一个尝试使用SQL用户定义的函数MS Server 2008上做以下

我想预测当客户将离开该银行,但我是系列硬币投掷的这样做直到你离开。投币式投注不一定总是在50/50,所以我可以将概率作为参数传递给当前客户的任期。

问题是,它不允许在函数内使用RAND(),我不明白为什么,但那很好,一定有一个原因。

这里是我的功能:

create function NewTenure (@tenure integer, @p float) 
returns integer 
as 
begin 
    declare @r float 
    declare @newten int 
    declare @attrite binary 
    set @attrite=0 
    set @newten = @tenure 
    set @r = RAND() 
    while (@attrite = 0) 
    begin 
     if (@r <= @p) set @attrite = 1; 
     if (@r > @p) set @newten = @newten+1  
    end 
    return(@newten) 
end 

在我看来,我需要生成0-1之间的随机值,这样我就可以把它比作概率来确定是否离开与否的客户。如果不允许使用RAND(),那么在函数内部生成一个SQL技巧? (我从很多年前的学校就知道我可以编写自己的随机数发生器,但我不想这样做,也不相信我应该这样做,随机数是一个基本的计算机功能,人们应该期望 - 我曾经使用过的任何其他语言都有一个)

我打算在新查询中调用该函数,以便在他们离开时更新具有预计任职期限的临时表,然后将其用于其他复杂计算。

回答

7

这是一个肮脏的伎俩。

CREATE VIEW dbo.vRand 
AS 
    SELECT r = RAND(); 
GO 

CREATE FUNCTION dbo.fRand() 
RETURNS DECIMAL(10,9) 
AS 
BEGIN 
    RETURN (SELECT r FROM dbo.vRand); 
END 
GO 

SELECT name, dbo.fRand() 
    FROM sys.all_objects; 
+0

非常感谢,这工作。 – user1617979