Обратите внимание, что порядок столбцов в предложении 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
Таким образом, вы будете устанавливать значения в таблице на основе новых значений, а не на старыхзначения.