自动更新查询SQL

时间:2015-08-30 01:51:36

标签: sql sql-server database

我试图让我的查询每年都自动更新,以便确定某个"债务"费用会每年增加,但无论我采用何种方法,它都无法正常工作。我的目标是每年自动增加75000。 以下是我试过的一些不起作用的东西。

CASE
        WHEN DATENAME(dy, GETDATE()) = 1 THEN Debt + 75000
        ELSE Debt
    END AS [Debtt]

我试图使用"债务=债务+ 75000"就像我在Java中所知道的那样,但我在" ="中得到了错误的语法。标志。 所需的值仅适用于dayOfYear = 1,但会在dayOfYear = 2时返回初始值

我也试过这个

UPDATE Table
SET Debt = Debt + 75000
WHERE DATENAME(dy, GETDATE()) = 1 

当我在那天执行查询时,这个只能工作。如果我继续执行它,该值将继续增加75000

最后但并非最不重要的是,我尝试使用变量添加IF语句。

@MoneyDebt AS MONEY = 0

IF DATENAME(dy, GETDATE()) = 1 
BEGIN
    UPDATE initialTable
    SET @MoneyDebt = @MoneyDebt + 75000
END
-- useless statements
SELECT @MoneyDebt AS [Debt]

这样,当dayOfYear不同于1时,它实际上使MoneyDebt = 0,当它为1时,由于某种原因它实际上使MoneyDebt = 150000(这是所需值的两倍)

在过去的3天里,我一直在努力破坏我的大脑,尝试各种可能性并在网上查看所有内容。是否根本无法对SQL进行自动更新?

应该注意我使用的是SQL Server 2014

2 个答案:

答案 0 :(得分:3)

你想做的事情有点尴尬。你可以在每年的第一天投入一份工作来自动进行更新。

但是,我的建议更简单。只需保留数据的第一年,然后通过添加基于已经过的年数的值来进行增量。您可以在视图中执行此操作。或者,您可以使用计算列来执行此操作:

alter table t
    add debtt as ( debt + 75000 + datediff(year, orig_date, getdate()) );

debtt将具有更新的值。

答案 1 :(得分:0)

在底部编辑。跳转到下面的MSFT部分。

(这个最重要的部分只是因为这个问题最初在其中有mysql标签,我向你们MSFT伙伴道歉。)

MYSQL

考虑使用mysql的创建事件策略,这可能会导致无需执行cron作业。

DELIMITER $$
CREATE EVENT annualThingEvent
ON SCHEDULE EVERY '1' YEAR
STARTS '2016-01-01 00:00:00'
DO 
BEGIN
 -- perform some annual thing, as complicated as you want
END$$
DELIMITER ;

CREATE EVENT上的手册页,

interval:
    quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE |
              WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE |
              DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND

正确设置事件甚至发生并监控它们非常重要。

show variables where variable_name='event_scheduler';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| event_scheduler | OFF   |
+-----------------+-------+

ooops,事件调度程序未打开。

我可以整天等待,事件甚至没有打开

SET GLOBAL event_scheduler = ON;  -- turn her on

show variables where variable_name='event_scheduler';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| event_scheduler | ON    |
+-----------------+-------+

按架构名称列出所有事件:

show events from so_gibberish;

show events\G; -- <--------- I like this one from mysql> prompt
show events; -- <--------- from workbench / sqlyog


*************************** 1. row ***************************
                  Db: so_gibberish
                Name: set_trips_finished
             Definer: GuySmiley@localhost
           Time zone: SYSTEM
                Type: RECURRING
          Execute at: NULL
      Interval value: 1
      Interval field: MINUTE
              Starts: 2015-08-23 00:00:00
                Ends: NULL
              Status: ENABLED
          Originator: 1
character_set_client: utf8
collation_connection: utf8_general_ci
  Database Collation: utf8_general_ci

MSFT

并不是我对它有任何了解,但我包含了这个,因为在删除整个答案时,OP问道。所以记住这一点。取自here

<强>概述

调度是每个数据库管理软件的一个非常有用的功能。在MS SQL Server中,SQL Server代理充当调度程序,并执行任务。

<强>解释

SQL Server代理相当于MySQL事件调度程序。它是除MS SQL Express之外的每个版本的一部分。它可以从SQL Server Management Studio访问。

但是,MS SQL实现与MySQL中的CREATE EVENT语句语法非常不同。您必须分别创建工作,工作步骤和计划。有两种方法可以执行此任务,您可以使用GUI或创建Transact-SQL语句。

使用T-SQL创建预定作业的一般步骤如下:

  • 执行sp_add_job创建工作。
  • 执行sp_add_jobstep以创建每个作业步骤。
  • 执行sp_add_schedule以创建计划。您可以定义更多 时间表,例如在凌晨3点和晚上11点运行。
  • 执行sp_attach_schedule将日程安排与作业相关联。
  • 执行sp_add_jobserver以设置作业的服务器。

另外,请查看有关实施工作的MSDN article