函数可以是确定的或不确定的。如果任何时候用一组特定的输入值调用函数时返回的结果总是相同的,则这些函数为确定的。如果每次调用函数时即使用的是相同的一组特定输入值,返回的结果总是不同的,则这些函数为不确定的。不确定的函数会产生副作用。副作用是更改数据库的某些全局状态,比如更新数据库表或某些外部资源,如文件或网络等(例如,修改文件或发送电子邮件消息)。不允许在用户定义函数主体中内置不确定函数;这些不确定函数如下:@@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   
尽管在用户定义函数主体中不允许有不确定函数,这些用户定义函数在调用扩展存储过程时仍会产生副作用。

解决方案 »

  1.   

    为函数添加一个参数,该参数的值恒为getdate()
      

  2.   

    变通一下,把getdate(),作为参数传进函数!
      

  3.   

    create view vi_getdate
    as
    select getdate() as output1
    gocreate function fn_getdate()
    returns datetime
    as
    begin
    declare @a datetime
    select @a = output1 from vi_getdate
    return(@a)
    end
    goselect dbo.fn_getdate() 就得到当前日期
      

  4.   

    函数的确定性和副作用
    函数可以是确定的或不确定的。如果任何时候用一组特定的输入值调用函数时返回的结果总是相同的,则这些函数为确定的。如果每次调用函数时即使用的是相同的一组特定输入值,返回的结果总是不同的,则这些函数为不确定的。不确定的函数会产生副作用。副作用是更改数据库的某些全局状态,比如更新数据库表或某些外部资源,如文件或网络等(例如,修改文件或发送电子邮件消息)。不允许在用户定义函数主体中内置不确定函数;这些不确定函数如下:@@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   尽管在用户定义函数主体中不允许有不确定函数,这些用户定义函数在调用扩展存储过程时仍会产生副作用。由于扩展存储过程会对数据库产生副作用,因此调用扩展存储过程的函数是不确定的。当用户定义函数调用会对数据库产生副作用的扩展存储过程时,不要指望结果集保持一致或执行函数。
      

  5.   

    多谢前面两位大哥
    to dulei115:你的意思是说如下吗:
    CREATE function fun_getRxxn(@dd datetime)
    然后调用该function的时候用dbo.fun_getRxxn(getdate())吗?
    这样好像也是不行的哟
      

  6.   

    可以啊
    if object_id('fun') is not null drop function fun
    go
    create function fun(@d datetime)
      returns datetime
    as
    begin
      return @d - 1
    end
    go
    select dbo.fun(getdate())
    go
    drop function fun
      

  7.   

    to dulei115:
    不好意思啦,我搞错了,是可以的,因为我的真正要写的function里面含有比较复杂的业务逻辑,所以导致了问题,现已通过。
    多谢!