Как удалить строку после обновления в операторе IF / ELSE? - PullRequest
1 голос
/ 23 января 2020

Мой сценарий -> Мне нужно обновить запись, если она существует, и удалить старую (я уверен, что «старая существует») после обновления, иначе вставить «старую». Я не могу выполнить DELETE запрос после IF EXISTS, так как это может произойти, если потребуется старый (будет вставлен из инструкции ELSE).

Вот моя попытка:

IF EXISTS (SELECT * FROM dbo.JDOMINO_CON WHERE GBC = '72227')  
   UPDATE dbo.JDOMINO_CON 
   SET GBC = '72227', 
       Description = 'RES_TF,10k,0402,1%,0,1W,100PPM/C', 
       Buildneed = Buildneed + 200, 
       Replaced = '72223' 
   WHERE GBC = '72227'

DELETE FROM dbo.JDOMINO_CON 
WHERE GBC = '72223' /* If updated I need to delete replaced row */

ELSE /*Here is error : Incorrect syntax near 'ELSE'*/
    INSERT INTO dbo.JDOMINO_CON (GBC,Description, Buildneed, Replaced) 
    VALUES ('72227', 'RES_TF,10k,0402,1%,0,1W,100PPM/C', 200, NULL)

Пример данных:

CREATE TABLE [dbo].[JDOMINO_CON] 
(
    [GBC]         INT          NULL,
    [Description] VARCHAR (80) NULL,
    [Buildneed]   INT          NULL,
    [Replaced]    VARCHAR (80) NULL
);

INSERT INTO @JDOMINO_CON (GBC, [Description], Buildneed, Replaced)
SELECT 72227, 'RES_TF,10k,0402,1%,0,1W,100PPM/C', 200, NULL
UNION ALL
SELECT 72223, 'RES_TF,10k,0402,5%,0,1W,100PPM/C', 200, NULL
UNION ALL

Ожидаемый результат -> только 1 строка -> 72227 / 'RES_TF, 10k, 0402,1%, 0,1 Вт, 100PPM / C' / Buildneed = 400 / Заменено = 72223

Итак, мой вопрос: как добавить оператор удаления, если запись существует?

Ответы [ 2 ]

2 голосов
/ 23 января 2020

Если вы хотите выполнить более одного оператора sql в ветви IF или ELSE, то вам нужно объявить блок операторов : это означает, что они обернуты в два запроса в BEGIN/END блок, как объяснено в документации :

Если не используется блок операторов, условие IF или ELSE может повлиять на производительность только одного Transact- SQL оператор.

Чтобы определить блок оператора, используйте ключевые слова управления потоком BEGIN и END.

В своем коде:

IF EXISTS(SELECT * FROM dbo.JDOMINO_CON WHERE GBC = '72227') 
BEGIN
    UPDATE dbo.JDOMINO_CON SET GBC = '72227', Description = 'RES_TF,10k,0402,1%,0,1W,100PPM/C', Buildneed = Buildneed + 200, Replaced = '72223' WHERE GBC = '72227'
    DELETE FROM dbo.JDOMINO_CON WHERE GBC = '72223'
END
ELSE 
INSERT INTO dbo.JDOMINO_CON (GBC,Description, Buildneed, Replaced) VALUES('72227', 'RES_TF,10k,0402,1%,0,1W,100PPM/C', 200, NULL);

Демонстрация на DB Fiddle

0 голосов
/ 23 января 2020

Вот исправленный формат запроса SQL к серверу.

IF EXISTS (
        SELECT *
        FROM dbo.JDOMINO_CON
        WHERE GBC = '72227'
        )
BEGIN
    UPDATE dbo.JDOMINO_CON
    SET GBC = '72227'
        ,[Description] = 'RES_TF,10k,0402,1%,0,1W,100PPM/C'
        ,Buildneed = Buildneed + 200
        ,Replaced = '72223'
    WHERE GBC = '72227'

   --Your delete statement will be here.
   DELETE FROM dbo.JDOMINO_CON 
   WHERE GBC = '72223' /* If updated I need to delete replaced row */
END
ELSE
BEGIN
    INSERT INTO dbo.JDOMINO_CON (
        GBC
        ,Description
        ,Buildneed
        ,Replaced
        )
    VALUES (
        '72227'
        ,'RES_TF,10k,0402,1%,0,1W,100PPM/C'
        ,200
        ,NULL
        )
END

Вот текущее демо для запроса. Вам нужно отладить и изменить существующий запрос для желаемого результата.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...