Как получить результаты из sql-заданий, не запуская их каждый раз

Я новичок в 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,

0

Ответов: 3


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;

0

добавьте столбец timex (timestamp) в таблицу R. поэтому в любое время вы можете получить свой последний набор результатов.


0

Основываясь на отзывах 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
SQL, SQL-сервер, соединение, SQL-работа,