如何循环遍历table变量进行具体计算?

How to loop over table variable to make specific calculations?

如果我有一个像这样的 table 变量,如何循环遍历此变量以进行一些处理:

DECLARE @userData TABLE(
                                    userId int NOT NULL,
                                    dayDate datetime NOT NULL,
                                    transIn datetime NULL,
                                    transOut datetime NULL,
                                    attIn datetime NULL,
                                    attOut datetime NULL,
                                    MissionIn datetime NOT NULL,
                                    MissionOut datetime NOT NULL,
                                    empState varchar(10) NULL
                                   );


                INSERT INTO @userData
                SELECT userid, trans_date,transtime_in,transtime_out,att_start_time,att_end_time,@Mission_fromdatetime,@Mission_todatetime,day_flag
                FROM datatable_o a
                WHERE a.userid = @userid AND a.trans_date = @date ORDER BY  transtime_in ;

根据整个案例的评论:

如果工作开始于:att_start_time,结束于att_end_time(工作周期]

每个员工都可以在同一天多次签到和签退,这样我们就可以跟着他了。 签到存储在 transtime_in 结帐存储在 transtime_out

我有 day_flag 所以我可以知道今天是 'W' 工作日或 'E' 周末

除了 emp_num ,date

之外,现在还要考虑所有这些信息

我想为员工计算 External mission over time :

我有四种情况:

  1. 没有入住退房&& 不是工作日[周末]所以员工 应该把所有的任务周期都算作加班
  2. 没有签入签出 && 工作日 [缺席] 所以员工应该 工作期只取任务期
  3. 有退房 && 非工作日 [周末] 所以 员工应该只从这些中取出任务期 入住退房
  4. 有签入签出 && 工作日,所以员工应该 只有这些签入签出的任务期间并且同时 下班时间.

示例:

emp_num     date         att_start   att_end    mission-in  mission-out
  672      2015-3-4       07:05:00    13:30:00   12:12:00    20:00:00

emp_num      date         trans_in     trans_out 

 672       2015-3-4       06:54:00     11:10:00
 672       2015-3-4       12:00:00     14:05:00

您可以通过 table 的副本获取帮助来遍历 table:

关于你的问题,假设你的 table 是:

DECLARE @userData TABLE(
                         userId int NOT NULL,
                         /*Other fields*/
                        );

而你的table的数据是:

INSERT INTO @userData
/*A SELECT or values*/

现在为您的 table 创建一个副本:

DECLARE @userData_2 TABLE(
                         userId int NOT NULL,
                         /*Structure should be the same as @userData*/
                        );
INSERT INTO @userData_2
SELECT * FROM  @userData

现在你可以循环并做任何你想做的事情了:

DECLARE @userId INT
WHILE EXISTS (SELECT * FROM @userData_2)
BEGIN
SET @userId=(SELECT TOP 1 userId FROM @userData)
/*

DO YOUR TRANSACTION HERE

*/
DELETE FROM @userData_2 WHERE userId=@userID
END

注意:这假设用户 ID 是唯一的,如果不是,那么您需要有一个唯一的字段,或者使用复合字段而不是用户 ID。