用sql语句的更新列值

xjhego 2009-05-27 04:42:20
如下记录
请问如何存储过程将expression列sql语句的结果值更新到value列,

emp_id value expression
1 NULL (select v_PAY_SALARY_ELEMENT.基本工资 from v_PAY_SALARY_ELEMENT where emp_id=1)
2 NULL (select v_PAY_SALARY_ELEMENT.奖金 from v_PAY_SALARY_ELEMENT where emp_id=2)
3 NULL (select v_PAY_SALARY_ELEMENT.基本工资 from v_PAY_SALARY_ELEMENT where emp_id=3)
4 NULL (select v_PAY_SALARY_ELEMENT.奖金 from v_PAY_SALARY_ELEMENT where emp_id=4)
5 NULL (select v_PAY_SALARY_ELEMENT.奖金 from v_PAY_SALARY_ELEMENT where emp_id=5)
6 NULL (select v_PAY_SALARY_ELEMENT.奖金 from v_PAY_SALARY_ELEMENT where emp_id=6)
7 NULL (select v_PAY_SALARY_ELEMENT.奖金 from v_PAY_SALARY_ELEMENT where emp_id=7)
8 NULL (select v_PAY_SALARY_ELEMENT.奖金 from v_PAY_SALARY_ELEMENT where emp_id=8)
...全文
246 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
百年树人 2009-05-31
  • 打赏
  • 举报
回复
这个得用游标来做。

CREATE TABLE TA(ID INT,VALUE INT)
CREATE TABLE TB(emp_id int,value int,expression varchar(100))

insert ta select 1,30 union all select 2,45 union all select 3 ,100
insert tb
select 1,null,'(select value from ta where id=2)' union all
select 2,null,'(select value from ta where id=1)'

-->更新
declare my_cursor cursor scroll dynamic for select expression,emp_id from tb
open my_cursor
declare @sql varchar(1000)
declare @exp varchar(100)
declare @empid int
fetch next from my_cursor into @exp,@empid
while(@@fetch_status=0)
begin
select @sql='update tb set value='+@exp+ ' where emp_id='+ltrim(@empid)
print @sql
exec(@sql)
fetch next from my_cursor into @exp,@empid
end
close my_cursor
deallocate my_cursor

-->查询
select * from tb

--drop table ta,tb

/**
emp_id value expression
----------- ----------- -----------------------------------------------
1 45 (select value from ta where id=2)
2 30 (select value from ta where id=1)

(所影响的行数为 2 行)
**/
xjhego 2009-05-31
  • 打赏
  • 举报
回复
还不是我想要的答案,
是我说的不够清楚,
其实上面的例子仅是一部分,不能写死case when tb.emp_id in (1,3) then 基本工资 else 奖金 end,这段应该也是动态的

希望的结果是执行第三列SQL语句的结果去更新第二列值,而这个SQL是任意的SQL
Zoezs 2009-05-27
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 xjhego 的回复:]
应该要用动态SQL实现
[/Quote]

declare @TABName varchar(8000)
declare @STR varchar(8000)
set @STR='update tb
set value=case when tb.emp_id in (1,3) then 基本工资 else 奖金 end
from tb join '+@TABName+'
on tb.emp_id='+@TABName+'.emp_id'

exec(@STR)
xjhego 2009-05-27
  • 打赏
  • 举报
回复
应该要用动态SQL实现
xjhego 2009-05-27
  • 打赏
  • 举报
回复
(select v_PAY_SALARY_ELEMENT.基本工资 from v_PAY_SALARY_ELEMENT where emp_id=1)
是动态写入的,不是固定的表v_PAY_SALARY_ELEMENT,也可能是其他的表名
Zoezs 2009-05-27
  • 打赏
  • 举报
回复

update tb set value=奖金
from tb join v_PAY_SALARY_ELEMENT
on tb.emp_id=v_PAY_SALARY_ELEMENT.emp_id
csdyyr 2009-05-27
  • 打赏
  • 举报
回复
update tb
set value=case when tb.emp_id in (1,3) then 基本工资 else 奖金 end
from tb join v_PAY_SALARY_ELEMENT
on tb.emp_id=v_PAY_SALARY_ELEMENT.emp_id
csdyyr 2009-05-27
  • 打赏
  • 举报
回复
update tb
set value=奖金
from tb join v_PAY_SALARY_ELEMENT
on tb.emp_id=v_PAY_SALARY_ELEMENT.emp_id

22,207

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧