想请教一下关于自定义函数编写的问题,因为第一次用,希望大家多帮助,谢谢
需求概述:有一张表ag1tab,里面有个日期字段probation_date,但是这个字段是字符型的,
形式是这样:20040623,varchar(8)。现在要通过这个日期来计算月份,就是随便输入
一个zprobation_date字段里的字符,可以计算出到现在(也就是getdate())为止一共有几个月。现在编有一段代码,但是运行有点问题,希望大家指点一下:
create function mon(@inputprobation_date varchar(8)) returns table
as 
return
(select datediff(mm,@inputprobation_date,
case when status='A' then getdate() else cast(T_DATE+18000000 as varchar(8)) end) + 1  mon 
from ag1tab
where probation_date > 0 
)
运行后说:
服务器: 消息 443,级别 16,状态 1,过程 mon,行 5
在函数内不正确地使用了 'getdate'。我知道可能函数用得有点问题,但语句问题应该是不大的。请大家费心帮助,谢谢。

解决方案 »

  1.   

    create function mon(@inputprobation_date varchar(8)) returns table
    as 
    return
    (select datediff(mm,@inputprobation_date,
    case when status='A' then dbo.getdate() else cast(T_DATE+18000000 as varchar(8)) end) + 1  mon 
    from ag1tab
    where probation_date > 0 
    )
      

  2.   

    函数里是不能用getdate()等不确定值函数的
    可以作个视图代替
      

  3.   

    函数中不允许使用不确定值的函数,请参考create function帮助.
    方法1:
    ----创建封装当前日期的视图
    create view vGetDate 
    as 
    select getdate() as now
    GO
    ----在函数中引用该视图
    create function mon(@inputprobation_date varchar(8)) returns table
    as 
    return
    (select datediff(mm,@inputprobation_date,
    case when status='A' then (select now from vGetDate) else cast(T_DATE+18000000 as varchar(8)) end) + 1  mon 
    from ag1tab
    where probation_date > 0 
    )方法2:
    将getdate()作为函数的参数
      

  4.   

    运行后:
    服务器: 消息 208,级别 16,状态 1,过程 mon,行 4
    对象名 'dbo.getdate' 无效。
     
    还是不行,再请大家想想办法
      

  5.   

    ----创建封装当前日期的视图
    create view vGetDate 
    as 
    select getdate() as now
    GO
    是不是数据库每日都会更新,还是以后运行是要重新创建
      

  6.   

    方法2:
    将getdate()作为函数的参数
    这个具体方法是什么?怎么操作呢?