Как обновить столбец только один раз в задании агента SQL Server, которое выполняется каждые 5 минут - PullRequest
2 голосов
/ 07 июня 2019

Я хочу запускать этот код только один раз в задании агента, которое срабатывает каждые 5 минут:

UPDATE mytable
SET text_column = (CONCAT('Added text - ', text_column))
WHERE status IN ('status1', 'status2', 'status3')
  AND other_criteria IN ('other_criteria1', 'other_criteria2', 'other_criteria3');

Новые записи могут вставляться в любое время дня и ночи, поэтому задание запускается каждые 5 минут.

text_column может быть или не быть NULL, когда запись вставлена ​​(что не имеет значения, но мешает мне использовать ISNULL в моем предложении where).

status может измениться «на лету» до запуска задания (что также не имеет значения, за исключением того, что я не могу обновить вышеупомянутый запрос, чтобы он выполнялся только с указанными статусами, а затем изменить статус после того, как будет выполнено обновление) это может произойти снова [потому что другие транзакции могут все еще происходить, пока запись находится в каком-либо состоянии].)

other_criteria обычно является статической информацией, но она ни в коем случае не уникальна ...

Итак, я хочу, чтобы это произошло в основном:

5-минутное задание выполняется - новая запись = status1 & other_criteria1 получает значение text_column равным 'Added_text - (text_column)'

Тогда я хочу избежать установки для текстового столбца этой записи значения «Добавленный текст - Добавленный текст - (text_column)» при следующем запуске задания, даже если оно все еще соответствует «status» и «other_criteria» в предложении where. ..

Возможно ли это без уточнения в моем предложении where?

Ответы [ 2 ]

2 голосов
/ 07 июня 2019

Самый простой способ - отфильтровать добавленный текст:

UPDATE mytable
SET text_column=(CONCAT('Added text - ', text_column))
WHERE status IN ('status1', 'status2', 'status3')
AND other_criteria IN ('other_criteria1', 'other_criteria2', 'other_criteria3')
AND text_column NOT LIKE 'Added text - %';
2 голосов
/ 07 июня 2019

Я бы добавил еще один столбец к вашей таблице

alter yourtable add column WasUpdated smallint default 0

Затем добавлю еще одно простое предложение к вашему утверждению.Для новой записи будет установлено нулевое значение, а после первого обновления - 1, поэтому одна строка будет обновляться только один раз.

UPDATE mytable
SET text_column=(CONCAT('Added text - ', text_column))
    ,wasUpdated = 1
WHERE status
IN ('status1', 'status2', 'status3')
AND other_criteria
IN ('other_criteria1', 'other_criteria2', 'other_criteria3')
AND wasUpdated = 0;

В таком столбце не будет головной боли, если у вас нет select * fromв ваших процедурах и т. д.

Как подсказал Виталий Борисов, вы также можете создать столбец даты.При таком подходе вы будете точно знать, когда была обновлена ​​строка.

  alter yourtable add column Updateddate datetime2 

    UPDATE mytable
    SET text_column=(CONCAT('Added text - ', text_column))
        ,Updateddate = getdate()
    WHERE status
    IN ('status1', 'status2', 'status3')
    AND other_criteria
    IN ('other_criteria1', 'other_criteria2', 'other_criteria3')
    AND Updateddate  is null;
Such column won't introduce any headache, unless you have `select * from` in your procedures etc.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...