【问题标题】:How to get results from sql-jobs without running it every time如何从 sql-jobs 获取结果而不每次都运行它
【发布时间】:2016-10-13 07:02:11
【问题描述】:

我是 SSC 的新手。我的场景是我创建了相互关联的表 A、B 和 C。

每当我需要这三个表中的数据时,我总是需要加入它们以获得结果。一直这样做有点费时间。

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

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

有没有什么办法可以每次都从R表中获取结果,而不需要运行SqlJob不断更新呢?

其他信息

我想要的解决方案是,每当我需要数据时,查询表 R,而不是连接表 A、B 和 C。您的解决方案必须考虑到这一点。

谢谢。

【问题讨论】:

标签: sql sql-server join sql-job


【解决方案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;

【讨论】:

  • 感谢您的回复。但我想在我的场景中使用过程。
【解决方案2】:

在您的 R 表中添加一个 timex(时间戳)列。 因此,您可以随时获得最新的结果集。

【讨论】:

  • 如果任何表(a,b,c)中的任何列值被更新,我需要再次运行 sqljob 以从 table-R 获取结果。
  • 为每个表写三个触发器来启动作业
【解决方案3】:

根据 OP 的反馈,表“R”必须始终是查询的表(这是作业吗?),那么我想唯一的解决方案是在每个表上放置一个 更新触发器表“A”、“B”和“C”,以便在更新这些表中的任何一个时,它们的更新内容会自动放置在表“R”中。

虽然效率不高,但至少比在某个时间(例如每 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

【讨论】:

    猜你喜欢
    • 2016-07-31
    • 2011-08-07
    • 1970-01-01
    • 1970-01-01
    • 2012-05-02
    • 2018-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多