Создать задание SQL, которое проверяет ежедневный ввод данных в таблицу? - PullRequest
1 голос
/ 22 июля 2010

Пишу свой первый SQL-запрос, который будет выполняться именно как SQL-задание, и я немного не в себе. У меня есть таблица в базе данных SQL Server 2005, которая ежедневно заполняется данными из разных зданий. Чтобы лучше контролировать систему, я пытаюсь написать задание SQL, которое будет выполнять запрос (или хранимую процедуру), чтобы проверить следующее:

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

Мой вопрос состоит из двух основных частей;

  1. Как я могу проверить, что данные существуют для каждого здания? Хотя есть колонка «здание», я не уверен, как проверить каждый из них. Мне нужен запрос / sp для сбоя, если все местоположения не сообщили об этом. Нужно ли создавать контрольную таблицу для сравнения запроса / sp? (так как может измениться номер отчетности здания)

  2. Как сделать так, чтобы этот запрос не выполнялся так, чтобы не выполнялось задание SQL? Нужно ли мне оборачивать его в какой-то код обработки ошибок?

Таблица:

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 ]

1 голос
/ 22 июля 2010

Рекомендации:

  • Делать использовать контрольную таблицу для зданий - вы можете обнаружить, что она уже существует, если вы используете обозреватель объектов в SQL Server Management Studio
  • Не используйте курсор или динамический 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
    
1 голос
/ 22 июля 2010

Вы можете создать хранимую процедуру, которая проверяет пропущенные записи.Процедура может вызвать 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'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...