SQL如何创建每天运行一次并根据缺少的内容更新表的作业?

时间:2019-08-05 20:59:02

标签: sql sql-server jobs

我有一个名为Z_N_FullRetailTable的简单表,该表具有Item_Number,Color_Code和Retail Price。

我手动创建了此表。但是,有时我们将商品添加到集合中,因此我需要将此表更新为新商品及其零售价格。

我想做的是对我们的Orders表运行查询。查看“零售”表中不存在的所有已订购商品,并将其以其首个销售价作为零售价添加到零售表中。

这是我写的查询。它查找所有已订购的商品,零售表中已存在的商品除外。

package no.magnus.controller;
@Controller("HomeController")
public class HomeController {

    // for the very first start
    // RequestMapping can be replaced with GetMapping
    @GetMapping("/")
    public ModelAndView index() {

        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("index");
        return modelAndView;
    }
}

我如何将其转变为每天运行一次的工作?

还有,有什么方法可以做到的,所以它是从2019年的订单中获得的最高价格,而不是所有时间的订单中的最高价格。但是,如果该商品没有在2019年订购,那么它将返回并从2018年的订单中获得最高价格,依此类推。还是会太复杂?

1 个答案:

答案 0 :(得分:3)

个人说明:您应该养成在代码中使用架构的习惯,例如:

From Order_Detail O 

应该是

From dbo.Order_Detail O

关于“我如何使这项工作每天运行一次”问题:

查询完成后,我会将其转换为存储过程。然后,从SSMS内,在SQL Server代理下,然后是“作业”-右键单击“作业”,再单击“新建作业”。 在常规标签中:

  • 用描述性的名字来命名工作
  • 将所有者设置为“ sa”

在“步骤”标签中:

  • 点击新建...
  • 命名步骤
  • 选择新存储过程所在的数据库。
  • 在命令文本区域中,输入命令:   执行dbo.StoredProcedureName
  • 点击确定

在“计划”标签中

  • 点击新建...
  • 命名时间表并选择频率和时间选项
  • 打个好

对于您的“获取最近一年的最高价格”之类的问题,我会这样做:

; WITH prices AS (SELECT Item_Number, Price
 , rn = ROW_NUMBER() OVER (Partition by Item_Number ORDER BY Year(OrderDate?) DESC, Price DESC))
SELECT * 
FROM prices
WHERE rn = 1