【问题标题】:Creating a stored procedure for a subscribed report为订阅的报表创建存储过程
【发布时间】:2016-02-25 17:15:20
【问题描述】:

我正在尝试创建一个通知系统,当我们的 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')

但是我得到了这两个错误:

消息 156,级别 15,状态 1,过程 JOBNOMATS,第 7 行不正确 关键字“RAISERROR”附近的语法。


消息 156,级别 15,状态 1,过程 JOBNOMATS,第 9 行不正确 关键字“ELSE”附近的语法。

【问题讨论】:

  • 对于初学者,您的SELECT CASE 需要和END
  • @RickS 谢谢 - 我应该只添加一个 END 还是在每次评估之后添加?

标签: sql-server stored-procedures reporting-services


【解决方案1】:

您不能在 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

一切都取决于查询的成本

【讨论】:

  • 非常感谢!最后一个似乎是最有效的。
  • 我会选择第二个...检查@@ROWCOUNT。但这是你的决定。
  • 好吧,你显然比我知道的更多。第二个!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-12
  • 2020-04-29
  • 1970-01-01
  • 2014-06-22
  • 1970-01-01
  • 2021-05-24
相关资源
最近更新 更多