SQL Server 2008 执行存储过程在第三次罢工



我被要求创建一个进程,当员工达到第三次罢工时触发存储过程。罢工与缺勤有关,因此,如果员工在 3 个月内休假 3 次,它就会触发扳机。

但。。。这仅适用于单个缺勤情况,因此如果一个人不在;例如,在 11/01/2016、12/01/2016 和 13/01/2016 上,这是一个实例。这意味着我无法计算请病假的天数。

有可用的数据,并且是我无法更新的固定过程:

Date        | EmpID | EmpName
01/01/2016  | JS01  | John Spartan
02/01/2016  | JS01  | John Spartan
03/01/2016  | JS01  | John Spartan
08/01/2016  | JS01  | John Spartan
19/02/2016  | JS01  | John Spartan
12/02/2016  | JS01  | John Spartan

基于上述实例,实例超过 2 个。所以这将触发程序

IF EXISTS (<Query Here>)
BEGIN
    EXEC usp_ThreeStrikes
END

有没有办法在 T-SQL 中执行此操作?

如果您无法添加列来帮助查询任务(例如。实例ID查询将分组以找出实例数),我认为最好的解决方案是为任务创建聚合CLR函数。

https://msdn.microsoft.com/en-us/library/ms131056.aspx

您可以尝试以下方法:

  1. 在表格中添加一个额外的列,以区分记录是否应考虑下一次警示(表示在 1 次实例之后,不应将其视为第二次)

  2. 根据以下条件创建 SQL 更新触发器以调用该过程:

    • 获取其列被考虑用于下一次警示的记录(与您在第一步中创建的列相同)
    • 对于这些特定记录,检查计数是否大于或等于 3,并调用存储过程
    • 对于这些特定记录,请更新附加列(在步骤 1 中创建),使其不考虑用于后续警示

希望这有帮助。

这里有一个查询,列出了每季度缺席三次或更多次的empid。可以在触发器中修改此查询,使其仅在触发器的inserted表中存在的 empid/quarters 中进行选择。

PS:我添加了一些随机缺席,以表明查询仅在缺勤次数为三个或更多时才选择。


CREATE TABLE #absences(dt DATE,empid NVARCHAR(128),empname NVARCHAR(128));
INSERT INTO #absences(dt,empid,empname)VALUES
    ('20151212','JS02','John Spartan2'),
    ('20151213','JS02','John Spartan2'),
    ('20151010','JS01','John Spartan'),
    ('20151011','JS01','John Spartan'),
    ('20151217','JS02','John Spartan2'),
    ('20151219','JS02','John Spartan2'),
    ('20160101','JS01','John Spartan'),
    ('20160102','JS01','John Spartan'),
    ('20160103','JS01','John Spartan'),
    ('20160108','JS01','John Spartan'),
    ('20160201','JS02','John Spartan2'),
    ('20160203','JS02','John Spartan2'),
    ('20160219','JS01','John Spartan'),
    ('20160212','JS01','John Spartan');
SELECT
    empid,
    [quarter]=DATEADD(QUARTER,DATEDIFF(QUARTER,0,o.dt),0)
FROM    
    #absences AS o
WHERE 
    NOT EXISTS (
        SELECT 1
        FROM #absences AS i
        WHERE i.empid=o.empid AND
              DATEDIFF(QUARTER,0,i.dt)=DATEDIFF(QUARTER,0,o.dt) AND
              i.dt=DATEADD(DAY,-1,o.dt)
    )
GROUP BY
    empid,
    DATEDIFF(QUARTER,0,o.dt)
HAVING
    COUNT(*)>=3;
DROP TABLE #absences;

结果:

+-------+-------------------------+
| empid |         quarter         |
+-------+-------------------------+
| JS02  | 2015-10-01 00:00:00.000 |
| JS01  | 2016-01-01 00:00:00.000 |
+-------+-------------------------+

最新更新