我正在将一堆函数从DB2转换为SQL服务器并且这个让我卡住了,我已经转换了这个函数:
create function prf_t_excinter_nzw(AC_ID_i int, TFH_i double) specific prf_t_excinter_nzw
RETURNS TABLE(ft_id int,rg_id int,thr double,value double )
R1: BEGIN ATOMIC
RETURN select l.ft_id, l.rg_id, r.thr, case when l.from is null
then to_value else ( thr - from ) / ( to - from ) * ( to_value - from_value ) + from_value end as value
from ( select ft_id, rg_id, to, from, to_value, from_value from ( select row_number() over (
partition by l.ft_id, l.rg_id, l.thr order by l.ft_id, l.rg_id, l.thr, r.thr desc) as #,
l.ft_id, l.rg_id, l.thr as to, r.thr as from, l.value as to_value, r.value as from_value
from (select ft_id, rg_id, thr, value from table ( prf_t_ftexc_nzw( AC_ID_i, TFH_i)) as d
order by ft_id, rg_id, thr asc ) as l
left outer join ( select ft_id, rg_id, thr, value from table ( prf_t_ftexc_nzw( AC_ID_i, TFH_i)) as d order by ft_id, rg_id, thr asc) as r
on l.ft_id = r.ft_id and l.rg_id = r.rg_id and l.thr > r.thr ) as l_r where # = 1 ) as l join ( select prm_id, thr from prf_t_prm_1d_thr as r
where prm_id in ( select id from prf_t_prm where name like '%RG_NZW') ) as r on l.rg_id = r.prm_id and( l.from < r.thr or l.from is null) and ( r.thr <= l.to )
order by l.ft_id, l.rg_id, r.thr ; END
到此:
create function prf_t_excinter_nzw(@AC_ID_i int,@TFH_i float)
RETURNS TABLE
RETURN select l.ft_id, l.rg_id, r.thr,case when l.from_value is null then to_value else ( thr-from_value )/(to_value-from_value)*(to_value-from_value)+from_value end as value
from (
select ft_id,rg_id,to_value,from_value,to_value,from_value
from (
select row_number() over ( partition by l.ft_id, l.rg_id, l.thr order by l.ft_id,l.rg_id, l.thr, r.thr desc) as num, l.ft_id, l.rg_id, l.to_value, r.from_value
from (
select ft_id, rg_id, thr, ac_value as to_value
from prf_t_ftexc_nzw(@AC_ID_i,@TFH_i) as d) as l
left outer join (
select ft_id, rg_id, thr, ac_value as from_value
from prf_t_ftexc_nzw(@AC_ID_i,@TFH_i) as d) as r
on l.ft_id = r.ft_id
and l.rg_id=r.rg_id
and l.thr > r.thr) as l_r
where num = 1) as l
join (
select prm_id, thr from prf_t_prm_1d_thr as r
where prm_id in (select id from prf_t_prm where name like '%RG_NZW')) as r
on l.rg_id=r.prm_id and (l.from_value<r.thr or l.from_value is null)
and (r.thr<=l.to_value)
此时我收到错误消息8156,级别16,状态1,过程prf_t_excinter_nzw,第18行 “l”指定了多次“to_value”列 任何提示/建议要修复?
答案 0 :(得分:1)
第5行肯定会产生错误:
select ft_id,rg_id,to_value,from_value,to_value,from_value
to_value
列表中列出了from_value
和SELECT
两次。如果不是子查询,这可能会很好,但由于它是子查询,因此每个字段都需要唯一的名称,在这种情况下,它们是多余的,因此只需删除重复项。
错误消息指向l
对象,该对象是您给出的子查询的别名,该子查询以上面提到的违规SELECT
行开头。
如果您不在查询中为不同的对象重复使用别名,这些问题就会变得更容易解决,因为这里有一些标记为l
的内容。
答案 1 :(得分:0)
问题是在第二级选择字段的两倍&#34; to_value&#34;。
删除一个