Обновление нескольких значений SQL, проверка значений в операторе обновления - PullRequest
0 голосов
/ 09 октября 2018

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

У нас есть значения x, y, z, которые оцениваются на основе друг друга.X - это «I», «U» или «D», «Y» - это «J» или «N», «Z» - это «J» или «N»

, допустимые значения которых оцениваются на основедругие, такие как:

UPDATE values
SET X = CASE WHEN X IN ('I','U') AND (Y = 'N' OR Y IS NULL) THEN 'D'
             WHEN X = 'D' AND Y = 'J' THEN 'N'
ELSE X
END,
Y = CASE WHEN X IN ('I','U') AND (Y = 'N' OR Y IS NULL) THEN 'J'
         WHEN X = 'D' AND Y = 'J' THEN 'N'
ELSE Y
END,
Z = CASE WHEN X <> 'D' AND Z = 'J' THEN 'N'
ELSE Z
END

Мой вопрос: влияет ли порядок дел на обновления после или нет.Будет ли обновленное значение X оцениваться в следующих случаях?

1 Ответ

0 голосов
/ 09 октября 2018

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

Вот краткая демонстрация:

Создатьи заполните образец таблицы:

DECLARE @T AS TABLE
(
    A int,
    B int
)

INSERT INTO @T (A, B) VALUES (1, 2)

Обновите B до значения A и A до 3:

UPDATE @T 
SET B = A,
    A = 3

SELECT A, B 
FROM @T

-- Result:

A   B
3   1

Обновите A до 4 и B до значения A:

UPDATE @T 
SET A = 4,
    B = A

SELECT A, B 
FROM @T

-- Result:    

A   B
4   3

Посмотреть это в реальном времени на rextester.

Что вы можете сделать, это использовать сохраненныйпроцедура или подготовленный оператор, и установите значения в таблице в соответствии со значениями параметров:

CREATE PROCEDURE UpdateValues
(
    @X char(1), 
    @Y char(1), 
    @Z char(1)
)
AS

UPDATE [values]
SET X = CASE WHEN @X IN ('I','U') AND (@Y = 'N' OR @Y IS NULL) THEN 'D'
             WHEN @X = 'D' AND @Y = 'J' THEN 'N'
ELSE @X
END,
Y = CASE WHEN @X IN ('I','U') AND (@Y = 'N' OR @Y IS NULL) THEN 'J'
         WHEN @X = 'D' AND @Y = 'J' THEN 'N'
ELSE @Y
END,
Z = CASE WHEN @X <> 'D' AND @Z = 'J' THEN 'N'
ELSE @Z
END

Таким образом, вы будете устанавливать значения в таблице на основе новых значений, а не на старыхзначения.

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