更新多个值SQL,检查更新语句中的值

时间:2018-10-09 07:55:59

标签: sql sql-server tsql sql-server-2008

我正在经历代码中的一些不良行为,想知道更新值的顺序是否重要。

我们有一个基于彼此评估的值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 :(得分: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

See it live on 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

这样,您将基于新值而不是旧值在表上设置值。