自动更新查询SQL

3

我试图让我的查询每年自动更新,以便某个“债务”费用每年增加,但无论我尝试什么方法,它都不能正常工作。我的目标是使其每年自动增加75000。

以下是我尝试过但未能成功的几件事情。

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

我尝试使用类似Java的 "Debt = Debt + 75000" 的语句,但在 "=" 符号处出现了语法错误。 这个预期值只对 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,在dayOfYear等于1时,由于某些原因它实际上使MoneyDebt = 150000(这是期望值的两倍)

过去3天里,我一直在苦苦思索,尝试每种可能性并检查网上的所有内容。难道SQL不能自动更新吗?

应该注意到我正在使用SQL Server 2014

2个回答

3
您想要做的事情有些麻烦。您可以安排一个工作,使其在每年的第一天自动进行更新。
然而,我的建议更简单。只需保留数据的第一年,然后通过添加基于过去年数的值来进行增量。您可以在视图中完成此操作。或者,您可以使用计算列完成此操作:
alter table t
    add debtt as ( debt + 75000 + datediff(year, orig_date, getdate()) );

debtt将会有更新后的值。


这个概念确实很有帮助,但是它没有起作用,我仍然会得到一个关于“=”符号的错误,说有语法错误。 - Patrick Younes
@PatrickYounes . . . 这是因为正确的语法使用 as 而不是 = - Gordon Linoff

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   |
+-----------------+-------+

糟糕,事件调度程序没有开启。

我可以等上一整天,但事件甚至还没有被开启。

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提出了这个问题,所以我将其包含在内。摘自此处

概述

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

解释

SQL Server Agent 是 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


顺便说一下,我只是剪切和粘贴了那个,我不是那么快。 - Drew
海报正在使用 SQL Server,而不是 MySQL。 - alroc
这是只有MySQL才有的功能吗?我的天啊,这种功能可以帮上大忙了。 - Patrick Younes
即使它不能在年级别上安排某些东西,每天/每小时的事情也可以触发,查看datetime数据类型的值并确定是否有必要。例如,行可能会杂乱无章地存在,今天有5个,11天没有,然后又有3个那天,2016年1月2日还有一个等等。然后它就被捡起来了。有一半的时间你只是想让这个东西自动启动,然后让程序员的代码去解决该做什么。因此,看起来您拥有MSFT工具箱中的所有工具。 - Drew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接