2016-02-25 3 views
0

Я пытаюсь создать систему уведомлений, которая предупреждает меня, когда что-то неправильно настроено в нашей базе данных ERP. У меня есть отчет, который я вручную должен запускать каждый день, чтобы проверить, есть ли что-нибудь для меня, чтобы исправить. Вместо этого я хотел бы, чтобы сообщение отправлено мне по электронной почте или какое-то уведомление, отправленное мне.Создание хранимой процедуры для подписанного отчета

Кто-то предложил следующее:

  • Создать отчет в SSRS (Готово, если отчет не имеет никаких данных нет ничего, чтобы исправить, если есть данные, мне нужно что-то исправить)

  • Создайте хранимую процедуру, которая будет поднимать ошибку, если нет данных

  • в докладе SSRS будет использовать хранимую процедуру набора данных
  • Подписаться на доклад и будет посылать только по электронной почте, если данные существуют

Я застрял на второй части с хранимой процедурой, вот мой код:

CREATE PROCEDURE JOBNOMATS 
AS 
SELECT CASE 
      WHEN (SELECT "JobHead"."JobNum", "JobHead"."Company", "JobHead"."PartDescription", "JobHead"."ReqDueDate", "JobMtl"."PartNum", "JobMtl"."MtlSeq", "JobHead"."InCopyList", "JobHead"."Plant" 
      FROM {oj "Epicor10Live"."Erp"."JobHead" "JobHead" LEFT OUTER JOIN "Epicor10Live"."Erp"."JobMtl" "JobMtl" ON ("JobHead"."Company"="JobMtl"."Company") AND ("JobHead"."JobNum"="JobMtl"."JobNum")} 
      WHERE "JobHead"."Company"='011' AND "JobMtl"."PartNum" IS NULL AND NOT ("JobHead"."JobNum"='95057' OR "JobHead"."JobNum"='AISMNJOB')) IS NULL 
THEN RAISERROR(50001,16,1) 
ELSE SELECT "JobHead"."JobNum", "JobHead"."Company", "JobHead"."PartDescription", "JobHead"."ReqDueDate", "JobMtl"."PartNum", "JobMtl"."MtlSeq", "JobHead"."InCopyList", "JobHead"."Plant" 
      FROM {oj "Epicor10Live"."Erp"."JobHead" "JobHead" LEFT OUTER JOIN "Epicor10Live"."Erp"."JobMtl" "JobMtl" ON ("JobHead"."Company"="JobMtl"."Company") AND ("JobHead"."JobNum"="JobMtl"."JobNum")} 
      WHERE "JobHead"."Company"='011' AND "JobMtl"."PartNum" IS NULL AND NOT ("JobHead"."JobNum"='95057' OR "JobHead"."JobNum"='AISMNJOB') 

Но я получаю эти две ошибки:

Msg 156, уровень 15, состояние 1, процедура JOBNOMATS, строка 7 Неверный синтаксис рядом с ключевым словом «RAISERROR».


Msg 156, Level 15, State 1, процедура JOBNOMATS, строка 9 Некорректное синтаксис около ключевого слова 'ELSE'.

+1

Для начала ваша 'SELECT CASE' требует и' END' –

+0

@RickS Спасибо. Должен ли я добавить только один END или после каждой оценки? – Machzy

ответ

0

Вы не можете сделать это в операторе CASE. Вы можете попробовать что-то вроде этого ...

CREATE PROCEDURE JOBNOMATS 
AS 
BEGIN 
    IF NOT EXISTS(
     SELECT NULL 
     FROM {oj "Epicor10Live"."Erp"."JobHead" "JobHead" 
      LEFT OUTER JOIN "Epicor10Live"."Erp"."JobMtl" "JobMtl" ON 
       ("JobHead"."Company"="JobMtl"."Company") 
      AND ("JobHead"."JobNum"="JobMtl"."JobNum")} 
     WHERE "JobHead"."Company"='011' AND "JobMtl"."PartNum" IS NULL 
     AND NOT ("JobHead"."JobNum"='95057' OR "JobHead"."JobNum"='AISMNJOB') 
    ) 
    BEGIN 
     RAISERROR(50001,16,1); 
    END 

    SELECT "JobHead"."JobNum", "JobHead"."Company", "JobHead"."PartDescription", "JobHead"."ReqDueDate", "JobMtl"."PartNum", "JobMtl"."MtlSeq", "JobHead"."InCopyList", "JobHead"."Plant" 
    FROM {oj "Epicor10Live"."Erp"."JobHead" "JobHead" LEFT OUTER JOIN "Epicor10Live"."Erp"."JobMtl" "JobMtl" ON ("JobHead"."Company"="JobMtl"."Company") AND ("JobHead"."JobNum"="JobMtl"."JobNum")} 
    WHERE "JobHead"."Company"='011' AND "JobMtl"."PartNum" IS NULL AND NOT ("JobHead"."JobNum"='95057' OR "JobHead"."JobNum"='AISMNJOB') 

END 

Есть лучшие способы сделать это. Выполнение одного и того же запроса дважды - это часть отходов.

Вы можете также проверить @@ ROWCOUNT после того, как запрос был выполнен, и поднять ошибку, если она была 0

CREATE PROCEDURE JOBNOMATS 
AS 
BEGIN 
    SELECT "JobHead"."JobNum", "JobHead"."Company", "JobHead"."PartDescription", "JobHead"."ReqDueDate", "JobMtl"."PartNum", "JobMtl"."MtlSeq", "JobHead"."InCopyList", "JobHead"."Plant" 
    FROM {oj "Epicor10Live"."Erp"."JobHead" "JobHead" LEFT OUTER JOIN "Epicor10Live"."Erp"."JobMtl" "JobMtl" ON ("JobHead"."Company"="JobMtl"."Company") AND ("JobHead"."JobNum"="JobMtl"."JobNum")} 
    WHERE "JobHead"."Company"='011' AND "JobMtl"."PartNum" IS NULL AND NOT ("JobHead"."JobNum"='95057' OR "JobHead"."JobNum"='AISMNJOB') 

    IF @@ROWCOUNT = 0 
     RAISERROR(50001,16,1); 

END 

ИЛИ

Можно также выбрать результаты в временную таблицу, и если количество записей в таблице темпа равно 0, поднимите ошибку еще ... выберите все из временной таблицы ...

CREATE PROCEDURE JOBNOMATS 
AS 
BEGIN 
    SELECT "JobHead"."JobNum", "JobHead"."Company", "JobHead"."PartDescription", "JobHead"."ReqDueDate", "JobMtl"."PartNum", "JobMtl"."MtlSeq", "JobHead"."InCopyList", "JobHead"."Plant" 
    INTO #TEMP 
    FROM {oj "Epicor10Live"."Erp"."JobHead" "JobHead" LEFT OUTER JOIN "Epicor10Live"."Erp"."JobMtl" "JobMtl" ON ("JobHead"."Company"="JobMtl"."Company") AND ("JobHead"."JobNum"="JobMtl"."JobNum")} 
    WHERE "JobHead"."Company"='011' AND "JobMtl"."PartNum" IS NULL AND NOT ("JobHead"."JobNum"='95057' OR "JobHead"."JobNum"='AISMNJOB') 

    IF (SELECT COUNT(1) FROM #TEMP) = 0 
     RAISERROR(50001,16,1); 

    --DO MORE STUFF IF YOU WANT TO... 

    SELECT * 
    FROM #TEMP 
END 

все зависит как дорого запрос

+0

Спасибо большое! Последний кажется, что он наиболее эффективен. – Machzy

+0

Я бы пошел со вторым ... проверил @@ ROWCOUNT. Но это ваш звонок. – Spock

+0

Хорошо, вы, очевидно, знаете гораздо больше, чем я об этом. Второй - это! – Machzy

Смежные вопросы