创建验证每日数据输入表的SQL作业?

时间:2010-07-22 16:59:30

标签: sql-server sql-server-2005 tsql

编写我的第一个SQL查询以专门作为SQL作业运行,我有点超出我的深度。我在SQL Server 2005数据库中有一个表,每天填充来自不同建筑物的数据。为了更好地监视系统,我正在尝试编写一个SQL作业,它将运行查询(或存储过程)来验证以下内容:

- At least one row of data appears each day per building

我的问题有两个主要部分;

  1. 如何验证每个建筑物的数据是否存在?虽然有一个“建筑”专栏,但我不确定如何验证每一个。我需要查询/ sp失败,除非所有位置都报告了它。我是否需要为查询/ sp创建一个控制表来进行比较? (因为建筑物报告的数量可以改变)

  2. 如何使此查询失败,以便SQL作业失败?我是否需要将其包装在某种错误处理代码中?

  3. 表:

    Employee   RawDate                     Building 
    Bob        2010-07-22 06:04:00.000     2
    Sally      2010-07-22 01:00:00.000     9
    Jane       2010-07-22 06:04:00.000     12
    Alex       2010-07-22 05:54:00.000     EA
    Vince      2010-07-22 07:59:00.000     30
    

    请注意,构建列至少有一个非数字值。报告的建筑物范围随着时间的推移而变化,所以我宁愿避免对建筑物值进行硬编码(我可以更新的表格会很好)。

    我是否应该使用游标或动态SQL来运行循环SELECT语句,该语句根据列出每个当前活动的建筑物的控制表来检查每个建筑物?

    任何帮助都将不胜感激。

    编辑:拼写

2 个答案:

答案 0 :(得分:1)

您可以创建一个检查缺少条目的存储过程。该过程可能会调用raiserror以使作业失败。例如:

if OBJECT_ID('CheckBuildingEntries') is null
    exec ('create procedure CheckBuildingEntries as select 1')
go
alter procedure CheckBuildingEntries(
    @check_date datetime)
as
declare @missing_buildings int

select  @missing_buildings = COUNT(*)
from    Buildings as b
left join
        YourTable as yt
on      yt.Building = b.name
        and dateadd(dd,0, datediff(dd,0,yt.RawDate)) = 
            dateadd(dd,0, datediff(dd,0,@check_date))
where   yt.Building is null

if @missing_buildings > 0
    begin
    raiserror('OMG!', 16, 0)
    end
go

在凌晨4点运行的示例预定作业,用于检查昨天的条目:

declare @yesterday datetime
set @yesterday = dateadd(day, -1, GETDATE())
exec CheckBuildingEntries @yesterday

如果缺少某个条目,则该作业将失败。您可以将其设置为向您发送电子邮件。

测试表:

create table Buildings (id int identity, name varchar(50))
create table YourTable (Employee varchar(50), RawDate datetime, 
                        Building varchar(50))

insert into Buildings (name)
          select '2'
union all select '9'
union all select '12'
union all select 'EA'
union all select '30'

insert into YourTable (Employee, RawDate, Building)
           select 'Bob', '2010-07-22 06:04:00.000', '2'
union all select 'Sally', '2010-07-22 01:00:00.000', '9'
union all select 'Jane', '2010-07-22 06:04:00.000', '12'
union all select 'Alex', '2010-07-22 05:54:00.000', 'EA'
union all select 'Vince', '2010-07-22 07:59:00.000', '30'

答案 1 :(得分:1)

建议:

  • 使用建筑物的控制表 - 您可能会找到一个 已经存在,如果您使用Object SQL Server管理中的资源管理器 工作室
  • 使用游标或动态SQL来运行循环 - 使用基于集合 相反,可能是某些东西 如下:

    SELECT BCT.Building, COUNT(YDT.Building) Build
    FROM   dbo.BuildingControlTable BCT
    LEFT JOIN dbo.YourDataTable YDT 
    ON BCT.Building = YDT.Building AND 
    CAST(FLOOR( CAST( GETDATE() AS FLOAT ) - 1 ) AS DATETIME ) =
        CAST(FLOOR( CAST( YDT.RawDate AS FLOAT ) ) AS DATETIME )
    GROUP BY BCT.Building