RT,以下为例:可否这样写呢?CREATE PROCEDURE sf_发工资 @员工号 char,@工资类别号 char,@日期 smalldatetime
AS
begin tran
insert into 缴纳保障费用(员工编号,保障类别编号,缴纳日期,缴纳额)
select @员工号, 保障类别编号,@日期,征收率*(select 基本工资 from 工资 where 工资.工资类别编号=@工资类别号)
from 社会保障
where 保障类别编号='1'
commit
GO
AS
begin tran
insert into 缴纳保障费用(员工编号,保障类别编号,缴纳日期,缴纳额)
select @员工号, 保障类别编号,@日期,征收率*(select 基本工资 from 工资 where 工资.工资类别编号=@工资类别号)
from 社会保障
where 保障类别编号='1'
commit
GO
在sql server中,这样做可以是可以,
但是有 可能 会影响效率.select @员工号, 保障类别编号,@日期,征收率*(select 基本工资 from 工资 where 工资.工资类别编号=@工资类别号)
from 社会保障如果"select from 社会保障"有n条,"select from 工资" 有m条, ( n>>1)
那么查询的次数就是n*m
而实际上,m次是多余的,因为每次查询的结果都是一样的,就多做了很多次的查询.
因此,一中比较好的做法是,如果能确定m=1,就先得到子查询的值放在变量中;如果m>1,就用一个临时表来放着当n,m很大的时候,这个效率的损失,还是很可观的