SQL Server 2008 exec存储过程在第3次攻击

时间:2016-02-22 10:11:23

标签: sql-server sql-server-2008

我被要求创建一个流程,当员工遇到第三次攻击时触发存储过程。罢工与缺席有关,因此如果员工在3个月内关闭3次,则会触发。

但是...... 这仅适用于单个缺席情况,所以如果一个人不在;例如,在2016年1月11日,2016年1月12日& 2016年1月13日这是一个例子。这意味着我不能指望生病的天数。

我可用的数据是一个我无法更新的固定过程:

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中执行此操作?

3 个答案:

答案 0 :(得分:0)

如果你不能添加列来帮助查询任务(例如,InstanceID查询将分组以查找实例数),我认为最好的解决方案是为任务创建聚合CLR函数。 / p>

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

答案 1 :(得分:0)

您可以尝试以下方法:

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

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

    • 获取其列被考虑用于下一次攻击的记录(与您在第一步中创建的列相同)
    • 对于那些特定记录,如果计数大于或等于3,则检查计数并调用存储过程
    • 对于这些特定记录,请更新附加列(在步骤1中创建),以便不考虑后续罢工
  3. 希望这有帮助。

答案 2 :(得分:0)

在这里,您有一个查询,其中列出了每季度缺席三次或更多次的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 |
+-------+-------------------------+