想破头皮的问题:计算列的case..when判断
有一表,其中一列名为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
怎么能够让函数执行次数最少还能够达到要求?
定义了一个函数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
怎么能够让函数执行次数最少还能够达到要求?
...全文


