比较SQL Server

时间:2015-12-25 07:16:52

标签: sql sql-server

  1. 在我的应用程序中,我记录每个阶段的每个作业的文件状态(例如,开始,预处理,处理,完成等)。
  2. 我想要的是,在每天结束时,将运行一个存储过程,它将检查某个作业是否预期会在特定次数内提供某种状态。
  3. 如果需要,则将消息设置为“成功”。如果不是,那么它相应地给出错误。(例如,缺少预处理状态,然后将消息设置为'预处理失败'等)。
  4. 我的方法是创建一个包含理想方案的查找表 每个工作,每个状态,以及他们当天的计数。

    • 然后我会从我的日志表和
    • 中统计特定工作的所有状态
    • 逐一与查询表进行比较。我不确定我是否选择了正确的方式来实现这一点。

    请指导。

2 个答案:

答案 0 :(得分:0)

日志表:

    Create Table Log_for_Jobs
    (
      Date_time datetime not null, 
      Job_name varchar(20) not null,
      Job_status varchar(10) null,
      Log_message varchar(100) null
    )

然后创建一个SP来检查作业,将结果放入此表中。

答案 1 :(得分:0)

你可以有两个你建议的表,一个用于记录你的工作历史,另一个用于存储可能的状态。

<强> JobState

ID | Description
 1 | Start
 2 | Pre processing
 3 | Processing
 4 | Finished
 5 | Error

我认为你在这里有两个结果,要么你的应用程序在给定状态下记录错误(例如在3 - 处理期间),或者它停止并且不再记录任何内容。我添加了5 - Error来表示应用程序错误状态。

接下来要考虑的是你需要记录每个州还是可以覆盖以前的州?记录每个状态的两个可能原因是知道每个步骤所花费的时间并记录额外信息以及每个步骤(例如,处理150行等)。但是如果不需要你可以只用下一个状态更新该作业的行,并且为了成功它应该以4结束 - 完成。

<强> JobHistory

ID | JobID | JobTime           | JobStateID | Message
 1 |    55 | 1 Jan 2015 9:45am |          1 | Start file c:\test.txt
 2 |    55 | 1 Jan 2015 9:47am |          2 | Preprocessing 117 rows...
 3 |    55 | 1 Jan 2015 9:55am |          3 | Processing
 4 |    55 | 1 Jan 2015 9:57am |          5 | ERROR: Unexpected character at line 321 - '@'

我假设它必须完成上一步才能进入下一步。如果是这种情况,那么您只需选择state = 4的所有作业即可成功完成所有作业(然后对它们执行某些操作)。

SELECT *
FROM JobHistory
WHERE State = 4
// AND JobTime is within the last day?

并选择所有作业,按作业ID分组,其中包含max(state)&lt;&gt; 4对于有错误的人。然后,您可以使用max状态执行某些操作,它可以是5 - 错误(使用表中记录的错误消息)或1,2,3,因此报告处理在此步骤停止。

SELECT JobID, Max(JobStateId) as EndJobStateId, Min(JobTime) as StartTime, Max(JobTime) as EndTime
FROM JobHistory
GROUP BY JobID
HAVING Max(JobStateId) <> 4