Я пытаюсь выполнить этот запрос с некоторой «условной логикой», это моя первая попытка сделать что-то подобное в базах данных.

Вот код:

DECLARE @iddevice INT;
SET @iddevice = 15;
IF(@iddevice = 15 AND DEVICEATTRIBUTES.DEVICEATTRIBUTE = 'PortA')
 BEGIN
  UPDATE DEVICEATTRIBUTES
  SET VALUE = '4701'
  WHERE IDDEVICE = 15 AND DEVICEATTRIBUTES.DEVICEATTRIBUTE = 'PortA'
 END


IF(@iddevice = 15 AND DEVICEATTRIBUTES.DEVICEATTRIBUTE = 'PortB')
 BEGIN
  UPDATE DEVICEATTRIBUTES
  SET VALUE = '4711'
  WHERE IDDEVICE = 15 AND DEVICEATTRIBUTES.DEVICEATTRIBUTE = 'PortB'
 END


IF(@iddevice = 15 AND DEVICEATTRIBUTES.DEVICEATTRIBUTE = 'IP')
 BEGIN
  UPDATE DEVICEATTRIBUTES
  SET VALUE = '172.19.106.201'
  WHERE IDDEVICE = 15 AND DEVICEATTRIBUTES.DEVICEATTRIBUTE = 'IP'
 END;

GO

Я знаю, что с синтаксисом что-то не так, мой вопрос ... как я могу добавить DEVICEATTRIBUTES.DEVICEATTRIBUTE внутри предложения if?

0
Gera 9 Июл 2020 в 12:38

2 ответа

Лучший ответ

Вы сценарий вы можете переписать следующим образом:

DECLARE @iddevice INT;
SET @iddevice = 15;

UPDATE DEVICEATTRIBUTES
SET VALUE = 
CASE
    WHEN DEVICEATTRIBUTES.DEVICEATTRIBUTE = 'PortA' THEN '4701'
    WHEN DEVICEATTRIBUTES.DEVICEATTRIBUTE = 'PortB' THEN '4711'
    WHEN DEVICEATTRIBUTES.DEVICEATTRIBUTE = 'IP' THEN '172.19.106.201'
END
WHERE IDDEVICE = @iddevice AND DEVICEATTRIBUTES.DEVICEATTRIBUTE IN ('PortA', 'PortB', 'IP')
1
Joe Taras 9 Июл 2020 в 09:45

В SQL Server вы можете использовать UPDATE с JOIN:

UPDATE DA
    SET VALUE = '4701'
    FROM DEVICEATTRIBUTES DA JOIN
         (VALUES ('PortA', '4701'),
                 ('PortB', '4711'),
                 ('IP', '172.19.106.201')
         ) V(DEVICEATTRIBUTE, VALUE)
         ON DA.DEVICEATTRIBUTE = V.DEVICEATTRIBUTE
    WHERE IDDEVICE = 15;

Предложение VALUES - удобный способ добавить значения, которые вы хотите изменить, и это снижает риск опечаток.

Однако в вашем коде вы можете использовать только три UPDATE. В операторах IF нет необходимости. Если ни одна строка не соответствует предложению WHERE, то никакие строки не обновляются.

1
Gordon Linoff 9 Июл 2020 в 10:49