具有随机数的SQL用户定义函数

时间:2012-08-22 19:38:48

标签: sql-server-2008-r2

我希望有人可以帮助我。

我试图在MS server 2008上使用SQL用户定义的函数来执行以下操作

我正在试图预测客户什么时候会离开银行,我会用一系列硬币投掷来做这件事直到你离开。硬币抛出不一定总是在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技巧在函数内生成? (我多年前从学校知道我可以编写自己的随机数生成器,但我不想这样做,我也不认为我应该这样做,随机数是一个人们应该期望的基本计算机功能 - 我用过的任何其他语言都有一个)

我计划在新查询中调用该函数,以便在它们离开时更新临时表,并将其用于其他复杂的计算。

1 个答案:

答案 0 :(得分:9)

这是一个肮脏的把戏。

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;