如何从sql-jobs获取结果而不是每次都运行它

时间:2016-10-13 07:02:11

标签: sql sql-server join sql-job

我是SSC的新手。我的情况是我创建了彼此相关的表A,B和C.

每当我需要来自这三个表的数据时,我总是需要加入它们才能获得结果。这样做有点费时。

因此我创建了一个表'R'和一个更新其内容的过程。在此过程中,我将连接所有表(A,B和C)并将结果存储在表R中。

要将结果输入此表,我创建了一个每天运行一次的SqlJob。但是,有一个问题。有时我想要A,B和C表中最近插入记录的结果(在R更新之前)。

是否有任何解决方案每次都可以从R表中获取结果而不运行SqlJob来不断更新它?

其他信息

我想要的解决方案是,只要我需要数据,就会查询表R,连接的表A,B和C.您的解决方案必须考虑到这一点。

谢谢。

3 个答案:

答案 0 :(得分:1)

不是运行程序来不断更新表'R',而是创建数据库视图。该视图将A,B和C连接在一起。

然后,只要您需要查询A,B和C,而不是通过查询表R而冒险获取过时数据,您就会查询该视图。

我不知道您的数据库架构,所以我不知道连接表A,B和C的字段,但它可能看起来像这样:

CREATE VIEW V1
AS
SELECT * FROM A INNER JOIN B ON A.X = B.X INNER JOIN C ON B.Y = C.Y;

要查询视图,您可以像使用表一样使用SELECT语句:

SELECT * FROM V1;

答案 1 :(得分:0)

在R表中添加timex(timestamp)列。 所以在任何时候你都可以获得最新的结果集。

答案 2 :(得分:0)

根据OP的反馈,表格' R'必须始终是查询的表格(这是作业吗?),然后我想唯一的解决方案是在每个表格上放置更新触发器' A',&#39 ; B'和' C'这样当任何这些表格更新时,他们更新的内容会自动放在表格中。

虽然效率低下,但至少这比在一段时间内运行存储过程更好,例如每5分钟一次。

CREATE PROCEDURE [usp_SyncR]
AS
BEGIN
    SET NOCOUNT ON;
    UPDATE [R]
        SELECT * 
               GETUTCDATE() as [UpdatedOn]
            FROM A INNER JOIN B ON A.X = B.X INNER JOIN C ON B.Y = C.Y
END

CREATE TRIGGER [trg_A_Sync_R]
    ON [A]
AFTER Update
AS 
BEGIN
    EXEC [usp_SyncR];
END

CREATE TRIGGER [trg_B_Sync_R]
    ON [B]
AFTER Update
AS 
BEGIN
    EXEC [usp_SyncR];
END

CREATE TRIGGER [trg_C_Sync_R]
    ON [C]
AFTER Update
AS 
BEGIN
    EXEC [usp_SyncR];
END