在 SQL Server 2014 中自动插入行

Automatically inserted rows in SQL Server 2014

我是SQL服务器的新手,所以我直接问我的问题:

假设我有两个 tables

我想做的是在 table A 上放置一种监听器,监听每一行的“'ai and frequence'”属性,然后将行插入 table B、例子:

  1. (v1, ...., "2016-03-01",30, ....,vN)一行tableA,所以在[=中增加了一行49=] B 从日期“2016-03-01”开始的每个月

所以在tableB上插入了一个新行:“2016-04-01”、“2016-05-01”、“2016-06-01”等等。

  1. 根据TableA中包含的信息可以计算出新插入的B行(插入只是一个过程的例子)

我已经在寻找这个问题,我找到的最相关的答案是使用触发器,但是触发器是在 INSERT/UPDATE/DELETE 之后或而不是 INSERT/UPDATE/DELETE 被触发的,并且这些操作是硬编码的,它不是启动流程的 DBMS(或上例中的当前日期),它是客户端。

欢迎大家提出意见。

谢谢,下回见。

在这种情况下,触发器可以正常工作。触发器确实在数据库级别触发,这意味着客户端无法绕过它。这似乎是您想要的,因为对此 table 的所有插入都将被触发器捕获。如果客户端向 Table A 中插入一条记录,则触发器将自动触发并根据您的逻辑将相关记录插入 Table B 中。我不知道你的完整逻辑,你需要检查月份等并确保它们不存在等。我将把它留作 reader 的练习。需要注意的是,存在一个名为 "inserted" 的虚拟 table,您可以检查它,这包括刚刚插入到 table A.

中的所有行
CREATE TRIGGER insertNewMonth
   ON  A
   AFTER INSERT
AS 
BEGIN
    SET NOCOUNT ON;
    insert B (b1, bi, bN)
    Select a1, a1, aN
    from inserted
END
GO

看起来您需要一个计划作业,因为您不希望行在插入 A 时插入 table B。计划作业可以调用存储过程或执行SQL直接查询。

creating a stored procedure 的语法如下:

CREATE PROCEDURE BuildBFromA
AS 
BEGIN
    DECLARE @Numbers TABLE
    (
         Number int Primary Key
    )

    --You get the idea
    INSERT into @Numbers
    VALUES (0),(1),(2),(3)

    --Put your insert query here.
    insert B (b1, bi, bN)
    Select a1, a1, aN
    from a
    join @Numbers n on 1=1
    where DATEADD(a.aN,n.Number,a.ai) = convert(date,getdate())
END
GO

adding a scheduled job 的语法如下:

USE msdb ;
GO
EXEC dbo.sp_add_job
    @job_name = N'Build B' ;
GO
EXEC sp_add_jobstep
    @job_name = N'Build B',
    @step_name = N'Insert Rows in B based on A',
    @subsystem = N'TSQL',
    @command = N'EXECUTE BuildBFromA', 
    @retry_attempts = 5,
    @retry_interval = 5 ;
GO
EXEC dbo.sp_add_schedule
    @schedule_name = N'RunEveryMinute',
    @freq_type = 4,
    @active_start_time = 233000;
USE msdb ;
GO
EXEC sp_attach_schedule
   @job_name = N'Build B',
   @schedule_name = N'RunEveryMinute';
GO
EXEC dbo.sp_add_jobserver
    @job_name = N'Build B';
GO

通常我会在 SQLFiddle.com 上创建一个示例,但该网站现在似乎无法正常工作。