Удалить запись sql с помощью инструкции if

#tsql

#tsql

Вопрос:

 update dbo.tblMessages
set messageFlags = (messageFlags   1)
where messageId = @messageId
  

Итак, это обновление в моей процедуре. Я хочу иметь возможность удалять запись после обновления, если messageFlags после ее обновления становится ’10’.

Как бы мне это сделать?

Ответ №1:

Добавьте < 10 условие в WHERE ОБНОВЛЕНИЯ. Если вы хотите удалить, когда 10, то вы говорите «сейчас 9?»

 -- DECLARE @rc int
update dbo.tblMessages
set
    messageFlags = (messageFlags   1)
where messageId = @messageId and messageId < 10
/*
or assign SET @rc = @@ROWCOUNT to do more stuff first
*/
IF @@ROWCOUNT = 0
    DELETE dbo.tblMessages WHERE messageId = @messageId 
  

Или используйте функцию назначения ОБНОВЛЕНИЯ. Аналогично предложению OUTPUT

 DECLARE @newvalue int

BEGIN TRANSACTIOn

update dbo.tblMessages
set
    @newvalue = messageFlags = (messageFlags   1)
where messageId = @messageId

IF @newvalue = 10
    DELETE dbo.tblMessages WHERE messageId = @messageId

COMMIT TRAN
  

Это сводится к вопросу: вам нужно, чтобы значение действительно было равно 10 перед удалением?

Комментарии:

1. Понял. и нет, это еще не обязательно должно быть 10. скорее всего, это было бы просто выполнением ненужной транзакции. Спасибо!

Ответ №2:

В вашей процедуре вы могли бы либо проверить значение messageFlags. Если она будет равна 10 (т. Е. до того, как произойдет вставка), то удалите ее или, если вы хотите, чтобы это произошло после обновления, удалите ее (после проверки).

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

Комментарии:

1. Я думаю, что хочу держаться подальше от триггеров, но как бы мне проверить значение, а затем выполнить обновление./

2. Извлеките текущее значение для этого поля с помощью инструкции SELECT. А затем на основе этого решите, что вы на самом деле хотите сделать. Например, если значение равно 9, то вы знаете, что 1 приведет к переходу к 10, после чего вы захотите его удалить. Поэтому нет смысла обновлять строку только для того, чтобы удалить ее. В противном случае вы бы просто обновили строку и не беспокоились о ее удалении. Имеет ли это смысл?

Ответ №3:

рассматривали ли вы инструкцию CASE? http://www.tizag.com/sqlTutorial/sqlcase.php

Комментарии:

1. Я не понимаю, как это связано с рассматриваемым вопросом, потому что они хотят удалить запись после того, как она станет 10. Инструкция case не позволила бы им сделать это.