2016-03-01 144 views
3

自动插入的行,我在SQL Server中相当新的,所以我就直接问我的问题:在SQL Server 2014

比方说,我有两个表

  • A(A1 TYPE1,.. 。,嗳DATE,频INT,...,安力typen)
    • frequence代表的天数
  • B(B1 TYPE1,...,I型BI,...,BN力typen)

我想要做的就是把一种听者对监听的'ai和频表一''属性,然后将行插入表B中,例如:

  1. (v1,...,“2016-03-01”,30,...,vN)a表A的一排,所以从表中每隔一个月开始从表中新增一行“2016-03-01”

所以在表B中插入新行“2016-04 -01“,”2016-05-01“,”2016-06-01“等。

  • 新插入乙行可以根据包含在表A(插入只是一个过程的一个例子)
  • 我已经寻找信息来计算这个问题以及我发现的最相关的答案是使用触发器,但触发器是在或之后触发的,而这些操作是硬编码的,它不是DBMS(或上述示例中的当前日期)启动过程,它是客户。

    每一句话都是值得欢迎的。

    谢谢,下面再见。

    +0

    嗨巴尔托,欢迎来到SO,很好的问题(在格式/规则方面)。 –

    +0

    目前还不清楚为什么你不愿意使用触发器 – FLICKER

    +0

    它不是真的由客户启动。客户端仅将行插入到表A中。Table A上创建的触发器将触发Trigger并将行插入到表B中。 – Squirrel

    回答

    1

    它看起来是因为你不喜欢你需要一个计划作业t希望在插入到A时将行插入到表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创建一个实例,但该网站似乎没有现在的工作。

    +0

    感谢亲爱的朋友,这就是“工作/听众”这个词。我正在寻找一种方法来附加一个检查A的每一行的“工作”,然后决定是否有条件被验证(在我给出的场景中:(inDays(currentDate - A.ai)%A.frequence = 0) – MassyB

    +0

    对不起,这是我在SO的第一个问题,我不知道只有5分钟的评论版,所以我会继续我的评论: 当条件被验证时,作业在表中进行一个处理B使用行中的信息(在A中)“触发”作业 – MassyB

    +0

    我不知道如何将作业完全附加到表格中,但是,使用作业和proc可以运行查询关于表A中的信息以影响表B,这不是很好,因为作业不会有任何智能,它只会按照你设定的任何时间表运行。 – Abraham

    1

    在这种情况下触发器可以正常工作。触发器会在数据库级别触发,这意味着它不能被客户端绕过。这似乎是你想要的,因为所有对此表的插入都会被触发器捕获。如果客户在表A中插入记录,则触发器将自动触发并根据您的逻辑将相关记录插入到表B中。我不知道你的完整逻辑,你需要检查月份等,并确保它们不存在等等。我将此作为练习给读者。需要注意的一点是,“插入”被称为虚拟表存在,你可以检查,这包括刚刚插入表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 
    
    +0

    在这种情况下,触发器将无法做到这一点,因为我希望进程在给定的时间之后完成,而不仅仅是在表格的INSERT/DELETE或UPDATE之后完成。A 。感谢您 – MassyB