view code and procedure code?

解决方案 »

  1.   

    view 中我调用了一个用户函数,屏蔽掉了就没有这个毛病了,但是以前好用呀!
    而且这个函数也没有什么问题
      

  2.   

    FUNCTION uf_hxsj(@uf_id int)  
    RETURNS int  AS  
    begin 
    declare @re_sj int 
     select @re_sj= ISNULL( DATEDIFF( hour,a.zhyzlssj , case when a.sjdgsj = 
          ( select max(c.sjdgsj) from jzx_cbgl_cbdt_khdgb c where c.hcbm = a.hcbm )
            then dbo.uf_last_hxsj(a.hcbm)
            else (SELECT MIN(e.sjdgsj) FROM jzx_cbgl_cbdt_khdgb e  
                   WHERE e.sjdgsj > a.sjdgsj and e.hcbm = a.hcbm ) end), 0) 
    from jzx_cbgl_cbdt_khdgb a 
    where a.id = @uf_id
    return case  when @re_sj< 0 then 0 else @re_sj end 
    end函数是为了返回一个时间,逻辑也没有什么错误
      

  3.   

    你在调用函数的时候要:dbo.funName()
      

  4.   

    dbo.uf_last_hxsj
    这个函数也拿出来看看啊!
      

  5.   

    FUNCTION uf_last_hxsj(@hxid integer)  
    RETURNS datetime  AS  
    begin 
    --找到同一搜船的下一个航线ID
    --先得到船舶名称航次的最后一条记录的时间
    --再跟据时间查找是否存在第一个比此时间大的记录
    --存在,返回hxid  不存在返回0
    declare @cb varchar(10)
    declare @dt datetime 
    declare @ret datetime 
    set @ret = '1900-1-1'
    select @cb = max(cbhh),@dt = max(sjdgsj)
      from jzx_cbgl_cbdt_khdgb
      where hcbm = @hxid
    select @ret =  min(sjdgsj)
    from jzx_cbgl_cbdt_khdgb where sjdgsj > @dt  and cbhh = @cb and jjgbz = 1
    return case when @ret>@dt then @ret else @dt end 
    end 
      

  6.   

    并且还有个问题,当成这个问题问了吧!
    如果放在视图中,就要牵扯到返回值小于零的情况,我用 ※※※※※ 表示刚刚的长代码 由于※※※※※会小于零,这个数值是航线时间,肯定不能小于零,因此要进行一次小于零就付零的过程,这就是我用函数的原因,
    但是如果我写成 case when ※※※※※ < 0 then 0 else ※※※※※end 肯定可以解决问题,但是带来的就是代码的长度和计算两次的问题,对于1000行记录尚可忍受,如果……
    所以,大家有什么好办法解决 这样的东西呢?
      

  7.   

    可以讲讲如果通过验证以后还会存在的问题有哪些吗?看来happydreamer(小黑)您很有经验的样子……谢谢了