我正在经历代码中的一些不良行为,想知道更新值的顺序是否重要。
我们有一个基于彼此评估的值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值吗?
答案 0 :(得分:1)
请注意,更新的SET
子句中的列顺序毫无意义。
整个行在update语句中立即更新,这意味着您正在使用列中的 old 值来验证更新。
这是一个快速演示:
创建并填充示例表:
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
您可以使用存储过程或准备好的语句,然后根据参数值在表上设置值:
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
这样,您将基于新值而不是旧值在表上设置值。