有一表,其中一列名为MyCol,数据类型为Varchar(100),存储的是十六进制的数据。
定义了一个函数GetContent,这个函数比较复杂,用来计算Col列中的部分数据内容,这个函数可能执行十六进制字符串转换成十进制数值的过程,并且还受到十六进制数据之间的关系影响。
我想用这个函数计算出一个计算列来,再根据计算列的取值显示一个提示信息,类似于select ID,Name,MyCol,
   tmp=dbo.GetContent(Substring(MyCol,8,2)),  
   case   
     when tmp>=128  then '每'+cast(Tmp-128 as varchar(10)) 
     else Cast(tmp as varchar(10)) 
   end
from MyTable但是总是不能实现,如果使用类似于如下的SQL语句,实现倒是能够实现,可就是跟踪的时候执行的SQL代码实在是太长了,效率非常低。因为它执行了好几次定义的函数。
select ID,Name,MyCol,
   case   
     when dbo.GetContent(Substring(MyCol,8,2))>=128 then '每'+cast(dbo.GetContent(Substring(MyCol,8,2))-128 as varchar(10)) 
     else Cast(dbo.GetContent(Substring(MyCol,8,2)),   as varchar(10)) 
   end
from MyTable怎么能够让函数执行次数最少还能够达到要求?

解决方案 »

  1.   

    第二种方法只是个简单的例子,实际上Case段应该有好多条判断语句(多达20条)。
      

  2.   

    我感觉书写不规范,sql要求书写十分的规范
      

  3.   

    select ID,Name,MyCol, 
      tmp=dbo.GetContent(Substring(MyCol,8,2)),  
      case  
        when tmp>=128  then '每'+cast(Tmp-128 as varchar(10)) 
        else Cast(tmp as varchar(10)) 
      end 
    from MyTable 你再子查询一次
      

  4.   

    SELECT 
    ID,NAME,MYCOL,TEM,
    case  
        when tmp>=128  then '每'+cast(Tmp-128 as varchar(10)) 
        else Cast(tmp as varchar(10)) 
      end AS COL
    FROM 
    (
    select ID,Name,MyCol, 
      tmp=dbo.GetContent(Substring(MyCol,8,2)) 
      from MyTable 
    ) AS T
      

  5.   

    select ID,Name,MyCol,  
      case  
        when tmp>=128  then '每'+cast(Tmp-128 as varchar(10)) 
        else Cast(tmp as varchar(10)) 
      end 
    from (select *, tmp=dbo.GetContent(Substring(MyCol,8,2))  from MyTable )aa
      

  6.   

    select 
      ID,Name,MyCol,  
      case  when tmp>=128  then '每'+cast(Tmp-128 as varchar(10)) else Cast(tmp as varchar(10)) end 
    from 
      (select *, tmp=dbo.GetContent(Substring(MyCol,8,2)) from MyTable )t
      

  7.   


    ;with a as 
    (select ID,Name,MyCol,tmp=dbo.GetContent(Substring(MyCol,8,2))from MyTable) 
    select ID,Name,MyCol,case when tmp>=128 then tem-128 else tem end as tem from a
      

  8.   

    TMP是Mytable中生成的表达式别名,该名称是不能在其他列中的。
    干脆将函数GetContent功能扩大一点,将判断功能放在里面,返回结果。