使用循环在SQL Server 2008中插入多行?

猫通维

我有一个临时表来存储一些数据以计算工资。数据与许多表相关,并且是很长的查询逻辑。

此存储过程是从其他表中获取一些数据,然后插入到PayrollTemp表中以备后用。它需要3个参数:开始和结束日期,以及EmployeeID主查询和嵌套查询(EmpID)。

因此,每当我们运行此存储过程时,我们只会得到

(影响1行)

我的问题是如何在SQL Server中使用循环EmployeeID顺序传递每个(EmpID)存储过程,以便将每个记录插入PayrollTemp表中。

Create PROCEDURE [dbo].[sp_PayrollTemp_Init]
@startDate date, @endDate date, @EmpID int

AS

INSERT INTO dbo.PayrollTemp([EmpID],[BasicSalary],[Allowance],[W_Hrs],[W_days],[OT150Hrs],[OT200Hrs],[OT300Hrs],[Night130Hrs],
[NightOT150Hrs],[NightOT200Hrs],[NightOT300Hrs],[WeekdayDutyDays],[WeekendDutyDays],[OtherEarning],[SI],[HI],[UI],[UnionFee],[DependentDeduction],[OtherDeduction])
        select e.Id,e.BasicSalary,e.Allowance,
        (select SUM(ts.NormalHours) from TimeSheetA ts where EmpID=@EmpID)W_Hrs,
        (SELECT
           (DATEDIFF(dd, @startDate, @endDate) + 1)
          -(DATEDIFF(wk, @startDate, @endDate) * 2)
          -(CASE WHEN DATENAME(dw, @startDate) = 'Sunday' THEN 1 ELSE 0 END)
          -(CASE WHEN DATENAME(dw, @endDate) = 'Saturday' THEN 1 ELSE 0 END))W_days,
        (select SUM(ts.OT150Hrs) from TimeSheetA ts where EmpID=@EmpID and TimeSheetDate between @startDate and @endDate)OT150Hrs,
        (select SUM(ts.OT200Hrs) from TimeSheetA ts where EmpID=@EmpID and TimeSheetDate between @startDate and @endDate)OT200Hrs,
        (select SUM(ts.OT300Hrs) from TimeSheetA ts where EmpID=@EmpID and TimeSheetDate between @startDate and @endDate)OT300Hrs,
        (select SUM(ts.Night130Hrs) from TimeSheetA ts where EmpID=@EmpID and TimeSheetDate between @startDate and @endDate)Night130Hrs,
        (select SUM(ts.NightOT150Hrs) from TimeSheetA ts where EmpID=@EmpID and TimeSheetDate between @startDate and @endDate)NightOT150Hrs,
        (select SUM(ts.NightOT200Hrs) from TimeSheetA ts where EmpID=@EmpID and TimeSheetDate between @startDate and @endDate)NightOT200Hrs,
        (select SUM(ts.NightOT300Hrs) from TimeSheetA ts where EmpID=@EmpID and TimeSheetDate between @startDate and @endDate)NightOT300Hrs,

        (select count(EmpID)WeekdayDuty from NightDutySchedule where DATENAME(DW,DutyDate) not in('Saturday','Sunday') and DutyDate between @startDate and @endDate and EmpID=@EmpID)WeekdayDutyDays,
        (select COUNT(EmpID) from NightDutySchedule where DATENAME(DW,DutyDate)='Saturday' or DATENAME(DW,DutyDate)='Sunday' and DutyDate between @startDate and @endDate and EmpID=@EmpID)WeekendDutyDays,
        (select SUM(EarningAmount) from EarningDetails where EarningDate between @startDate and @endDate and EmpID=@EmpID)OtherEarning,
        (SELECT case e.Is_Probation
            WHEN  'False' THEN
            e.BasicSalary*0.08
            ELSE 0 end 
          )SI,
          (SELECT case e.Is_Probation
            WHEN  'False' THEN
            e.BasicSalary*0.015
            ELSE 0 end 
          )HI,
          (SELECT case e.Is_Probation
            WHEN  'False' THEN
            e.BasicSalary*0.01
            ELSE 0 end 
          )UI,
          (SELECT case e.Is_Probation
            WHEN  'False' THEN
            case  when e.BasicSalary > 4000000 or e.BasicSalary = 4000000 then  20000   else 15000 end
            ELSE 0 end 
          )UnionFee,
          (SELECT case e.Is_Probation
            WHEN  'False' THEN
                e.Dependants * 3600000
            ELSE 0 end 
          )DependentDeduction,
         (select SUM(DeductionAmount) from DeductionDetails where DeductionDate between @startDate and @endDate and EmpID=@EmpID)OtherDeduction
          from Employee e where e.Is_Active='True' and e.Foreigner='False' and e.Id=@EmpID

   declare @startDate date, @endDate date, @EmpID int
    set @startDate='2015-09-01'
    set @endDate='2015-09-30'
    set  @EmpID='3'
    select e.Id,e.BasicSalary,e.Allowance,SUM(ts.NormalHours)W_Hrs,
    (SELECT
               (DATEDIFF(dd, @startDate, @endDate) + 1)
              -(DATEDIFF(wk, @startDate, @endDate) * 2)
              -(CASE WHEN DATENAME(dw, @startDate) = 'Sunday' THEN 1 ELSE 0 END)
              -(CASE WHEN DATENAME(dw, @endDate) = 'Saturday' THEN 1 ELSE 0 END))W_days,
        SUM(ts.OT150Hrs)OT150Hrs,SUM(ts.OT200Hrs)OT200Hrs, SUM(ts.OT300Hrs)OT300Hrs,SUM(ts.Night130Hrs) Night130Hrs,
        SUM(ts.NightOT150Hrs)NightOT150Hrs,SUM(ts.NightOT200Hrs)NightOT200Hrs,SUM(ts.NightOT300Hrs)NightOT300Hrs,
        (SELECT COUNT(case 
                WHEN DATENAME(DW,sch.DutyDate) not in('Saturday','Sunday') THEN
                    1
                ELSE 0 end 
              )WeekdayDutyDays,

        (SELECT COUNT(case 
                WHEN DATENAME(DW,sch.DutyDate)  in('Saturday','Sunday') THEN
                    1
                ELSE 0 end 
              )WeekendDutyDays,
        SUM(ed.EarningAmount)OtherEarning,
        (SELECT case e.Is_Probation
                WHEN  'False' THEN
                e.BasicSalary*0.08
                ELSE 0 end 
              )SI,
              (SELECT case e.Is_Probation
                WHEN  'False' THEN
                e.BasicSalary*0.015
                ELSE 0 end 
              )HI,
              (SELECT case e.Is_Probation
                WHEN  'False' THEN
                e.BasicSalary*0.01
                ELSE 0 end 
              )UI,
              (SELECT case e.Is_Probation
                WHEN  'False' THEN
                case  when e.BasicSalary > 4000000 or e.BasicSalary = 4000000 then  20000   else 15000 end
                ELSE 0 end 
              )UnionFee,
              (SELECT case e.Is_Probation
                WHEN  'False' THEN
                    e.Dependants * 3600000
                ELSE 0 end 
              )DependentDeduction,
             SUM(ded.DeductionAmount) OtherDeduction

    from Employee e 
    inner join TimeSheetA ts
    on e.Id=ts.EmpID and e.Is_Active='True' and e.Foreigner='False' 
    inner join NightDutySchedule sch
    on e.Id=sch.EmpID and sch.DutyDate >= @startDate and sch.DutyDate <= @endDate
    inner join  EarningDetails ed
    on e.Id=ed.EmpID and ed.EarningDate >= @startDate and ed.EarningDate <= @endDate
    inner join DeductionDetails ded
    on e.Id= ded.EmpID and ded.DeductionDate >= @startDate and ded.DeductionDate <= @endDate

我修改为使用内部连接语句,但是当我执行命令时,它显示如下错误:

    Msg 102, Level 15, State 1, Line 62
Incorrect syntax near '@endDate'.

第62行是:在e.Id = ded.EmpID和ded.DeductionDate> = @startDate和ded.DeductionDate <= @endDate上(这是最后一个,为什么?)

伊斯梅尔·富恩特斯(Ismael Fuentes)

您必须使用游标:MSDN-游标

一些示例代码:

DECLARE cursorName
CURSOR FAST_FORWARD FOR SELECT a,b FROM table WHERE a > 1
DECLARE @a int
DECLARE @b varchar(10)
OPEN cursorName
FETCH NEXT FROM cursorName
INTO @a,
    @b

WHILE ( @@FETCH_STATUS = 0 )  BEGIN
--Code and procedure you want to call with @a and @b for each row
FETCH NEXT FROM cursorName
INTO @a, @b
END
CLOSE cursorName
DEALLOCATE cursorName

希望能帮助到你 :)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

SQL Server 2008中的循环插入语句

来自分类Dev

SQL Server 2008中的循环插入语句

来自分类Dev

使用查询在SQL Server 2008中插入5000条记录

来自分类Dev

使用并显示插入到SQL Server 2008中的数字吗?

来自分类Dev

SQL Server 2008-从多行中删除字符

来自分类Dev

SQL Server从C#中的.sql文件插入多行

来自分类Dev

SQL Server 2008中的While循环迭代日期范围,然后插入

来自分类Dev

使用参数SQL Server插入多行

来自分类Dev

SQL Server 2008中的循环联接

来自分类Dev

SQL Server CE 插入多行

来自分类Dev

在SQL Server 2008中插入希伯来语值

来自分类Dev

如何在Sql Server 2008中插入日期?

来自分类Dev

SQL Server 2008在表中插入缺少日期的新记录

来自分类Dev

在SQL Server 2008 R2中插入几何值

来自分类Dev

将 USP 输出插入 SQL Server 2008 中的表

来自分类Dev

循环访问拆分字符串变量以在SQL Server 2008中的存储过程中插入行

来自分类Dev

使用SQL Server 2008中的select语句和其他列插入表

来自分类Dev

使用select语句插入表并在SQL Server 2008中添加其他列

来自分类Dev

SQL Server:使用游标循环并插入增量值

来自分类Dev

使用IN子句更新SQL Server中的多行

来自分类Dev

SQL Server:基于不同表中的列向表中插入多行

来自分类Dev

SQL SERVER如何使用Insert into select语句插入多行

来自分类Dev

加快SQL Server 2008插入查询的速度

来自分类Dev

是否在Select Statements SQL Server 2008中循环?

来自分类Dev

使用SQL Server的bash中的Bad For循环变量

来自分类Dev

在SQL Server中的存储过程中使用循环

来自分类Dev

在SQL Server 2008中无法使用Float

来自分类Dev

如何在Sql Server 2008中的一个MERGE查询中更新,插入,删除?

来自分类Dev

在SQL Server 2008中将累积总计插入到我的表中

Related 相关文章

  1. 1

    SQL Server 2008中的循环插入语句

  2. 2

    SQL Server 2008中的循环插入语句

  3. 3

    使用查询在SQL Server 2008中插入5000条记录

  4. 4

    使用并显示插入到SQL Server 2008中的数字吗?

  5. 5

    SQL Server 2008-从多行中删除字符

  6. 6

    SQL Server从C#中的.sql文件插入多行

  7. 7

    SQL Server 2008中的While循环迭代日期范围,然后插入

  8. 8

    使用参数SQL Server插入多行

  9. 9

    SQL Server 2008中的循环联接

  10. 10

    SQL Server CE 插入多行

  11. 11

    在SQL Server 2008中插入希伯来语值

  12. 12

    如何在Sql Server 2008中插入日期?

  13. 13

    SQL Server 2008在表中插入缺少日期的新记录

  14. 14

    在SQL Server 2008 R2中插入几何值

  15. 15

    将 USP 输出插入 SQL Server 2008 中的表

  16. 16

    循环访问拆分字符串变量以在SQL Server 2008中的存储过程中插入行

  17. 17

    使用SQL Server 2008中的select语句和其他列插入表

  18. 18

    使用select语句插入表并在SQL Server 2008中添加其他列

  19. 19

    SQL Server:使用游标循环并插入增量值

  20. 20

    使用IN子句更新SQL Server中的多行

  21. 21

    SQL Server:基于不同表中的列向表中插入多行

  22. 22

    SQL SERVER如何使用Insert into select语句插入多行

  23. 23

    加快SQL Server 2008插入查询的速度

  24. 24

    是否在Select Statements SQL Server 2008中循环?

  25. 25

    使用SQL Server的bash中的Bad For循环变量

  26. 26

    在SQL Server中的存储过程中使用循环

  27. 27

    在SQL Server 2008中无法使用Float

  28. 28

    如何在Sql Server 2008中的一个MERGE查询中更新,插入,删除?

  29. 29

    在SQL Server 2008中将累积总计插入到我的表中

热门标签

归档