当前位置: 代码迷 >> Sql Server >> 麻烦解决一个变量赋值后参与其他运算出错的有关问题
  详细解决方案

麻烦解决一个变量赋值后参与其他运算出错的有关问题

热度:26   发布时间:2016-04-24 18:27:52.0
麻烦解决一个变量赋值后参与其他运算出错的问题
学艺不精,对sql临时变量赋值的语法规则掌握不牢。最近,写了一段代码,但提交执行时,始终提示“域错误”,百思不得其解。望各位仁兄不吝赐教!

declare @coefficient_value float
update T_2013_12 set @coefficient_value=power((T_2013_12.interm_1-range_rule.min_2013)/(range_rule.max_2013-range_rule.min_2013),1.4)*40+60
from T_2013_12
inner join range_rule
on T_2013_12.index_id = range_rule.index_id
UPDATE T_2013_12 SET evaluate_mark_2013_1court = 
   case when T_2013_12.variation_char=1 and T_2013_12.interm_1>range_rule.min_2013 then 60
        when T_2013_12.variation_char=2 and T_2013_12.interm_1<range_rule.min_2013 then 60
        else( case when  @coefficient_value<60 then 60
                   when  @coefficient_value>100 then 100
                   else  @coefficient_value end)
        end
from T_2013_12
inner join range_rule
on T_2013_12.index_id = range_rule.index_id

------解决方案--------------------

--变量赋值
select @coefficient_value=power((T_2013_12.interm_1-range_rule.min_2013)/(range_rule.max_2013-range_rule.min_2013),1.4)*40+60 from T_2013_12 inner join range_rule on T_2013_12.index_id = range_rule.index_id 

------解决方案--------------------

;with cte as
(
    select a.index_id,b.min_2013,
           power((a.interm_1 - b.min_2013)
           /(a.max_2013 - b.min_2013),1.4)*40+60 as iscontrl
    from T_2013_12 a inner join range_rule b
         on a.index_id = b.index_id
)

update a
set a.evaluate_mark_2013_1court =
            case when a.variation_char= 1 and a.interm_1 > b.min_2013
            then 60
            when a.variation_char = 2 and a.interm_1 < b.min_2013
            then 60
            else(case when  b.iscontrl<60
                      then 60
                      when  b.iscontrl>100
                      then 100
                      else  b.iscontrl end)
            end
from T_2013_12 a inner join cte b
     on a.index_id = b.index_id


这样试试如何!
------解决方案--------------------
引用。刚才按照您讲的方案修改了代码,还是提示“发生域错误”。
对此,我的浅见是,于临时变量赋值而言,无论是select赋值还是用update赋值,都可以达到同样效果,不知这样的理解是否正确?
如果上述理解是正确的,那么发生错误应该为其他原因。


update T_2013_12 set @coefficient_value=power((T_2013_12.interm_1-range_rule.min_2013)/(range_rule.max_2013-range_rule.min_2013),1.4)*40+60
from T_2013_12 
亲,此处不能用update,update是更新数据,与赋值语句还是不一样的

update table_name set 字段=new_value [where 条件]  --后面没有[from]

------解决方案--------------------
赋值,除了SELECT ,SET
没见过使用update的


--模拟场景
declare @a  table   (a int,b int)
declare @b table (a int,b int)
declare @x int
set @x=90 --此处,你的赋值我看出来了,你是需要个类似于循环或者游标。

insert into @a(a,b) values (1,1),(2,3),(3,4)
insert into @b(a,b) values (1,1),(2,3),(3,4)
update @a set b= case when a.a=1 and a.a=b.a then 60 when a.a=2 and a.a=b.a then 80 else (case when @x>90 then 190 when @x<95 then 200 end) end
from @a as a inner join @b as b on a.a=b.a

---结果展示--
/*

(3 行受影响)

(3 行受影响)

(3 行受影响)

*/

------解决方案--------------------
UPDATE A SET TOTAL=S.TOTAL, MAIN=S.MAIN, OTHER=S.OTHER 
------解决方案--------------------
  相关解决方案