有一表,其中一列名为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怎么能够让函数执行次数最少还能够达到要求?
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 你再子查询一次
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
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
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
;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
干脆将函数GetContent功能扩大一点,将判断功能放在里面,返回结果。