我是SQL Server的新手,所以我会直接问我的问题:
假设我有两张桌子
A
(a1 type1,...,ai DATE,frequency INT,...,aN typeN)
frequence
代表天数B
(b1 type1,...,bi typei,....,bN typeN)我想要做的是在表A上放置一种监听器来监听每行的“ai和频率”属性,然后将行插入表B中,例如:
因此在表B中插入一个新行:“2016-04-01”,“2016-05-01”,“2016-06-01”等等。
我已经找到了这个问题,我找到的最相关的答案是使用触发器,但触发器在INSERT/UPDATE/DELETE
之后或之后触发,而这些操作是硬编码的,它不是DBMS (或上面示例中的当前日期)启动流程,它是客户端。
欢迎发表评论。
谢谢你,很快就会在下面见到你。
答案 0 :(得分: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
答案 1 :(得分:1)
看起来您需要一个预定作业,因为您不希望在将它们插入A时将行插入到表B中。预定作业可以调用存储过程或直接执行SQL查询。 / p>
以下是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上创建一个示例,但该网站现在似乎不起作用。