rand是不确定函数.而用户定义函数是不支持不确定函数的.

解决方案 »

  1.   

    在自定义的函数里面不允许包含不确定的函数。
    用户定义函数中不允许使用会对每个调用返回不同数据的内置函数。用户定义函数中不允许使用以下内置函数:@@CONNECTIONS @@PACK_SENT GETDATE 
    @@CPU_BUSY @@PACKET_ERRORS GetUTCDate 
    @@IDLE @@TIMETICKS NEWID 
    @@IO_BUSY @@TOTAL_ERRORS RAND 
    @@MAX_CONNECTIONS @@TOTAL_READ TEXTPTR 
    @@PACK_RECEIVED @@TOTAL_WRITE
    查看联机帮助
    不允许在用户定义函数主体中内置不确定函数;这些不确定函数如下:@@CONNECTIONS 
    @@TOTAL_ERRORS 
    @@CPU_BUSY 
    @@TOTAL_READ 
    @@IDLE 
    @@TOTAL_WRITE 
    @@IO_BUSY 
    GETDATE 
    @@MAX_CONNECTIONS 
    GETUTCDATE 
    @@PACK_RECEIVED 
    NEWID 
    @@PACK_SENT 
    RAND 
    @@PACKET_ERRORS 
    TEXTPTR 
    @@TIMETICKS   
    create view v_getdate
    as
    select date=getdate()
    gocreate function dbo.testdate ()
    returns int
    as
    begin
        ------------------------
        declare @a datetime
        select @a = date from v_getdate
        -------------------------
        return 1
    end
    gogetdate()是不确定函数,而用户定义函数中不允许使用不确定函数.使用一个视图中转一下即可,参考我上面的.
    注;以上是引用函数内部BEGIN...END 块中的语句不能有任何副作用。函数副作用是指对具有函数外作用域(例如数据库表的修改)的资源状态的任何永久性更改。函数中的语句唯一能做的更改是对函数上的局部对象(如局部游标或局部变量)的更改。不能在函数中执行的操作包括:对数据库表的修改,对不在函数上的局部游标进行操作,发送电子邮件,尝试修改目录,以及生成返回至用户的结果集。在函数中不可使用exec,也就不能执行存储过程(当然也包括SP_打头的系统存储过程),不能使用动态SQL;函数中不能更改函数以外的对象,如对Table的Insert\Delete\Update;
    不能在函数中执行的操作包括:对数据库表的修改,对不在函数上的局部游标进行操作,发送电子邮件,尝试修改目录,以及生成返回至用户的结果集。 
      

  2.   

    不允许在用户定义函数主体中内置不确定函数;这些不确定函数如下:@@CONNECTIONS @@TOTAL_ERRORS 
    @@CPU_BUSY @@TOTAL_READ 
    @@IDLE @@TOTAL_WRITE 
    @@IO_BUSY GETDATE 
    @@MAX_CONNECTIONS GETUTCDATE 
    @@PACK_RECEIVED NEWID 
    @@PACK_SENT RAND 
    @@PACKET_ERRORS TEXTPTR 
    @@TIMETICKS   
      

  3.   

    rand()是非确定性函数,而在用户定义函数中只能调用确定性函数。