持久计算列何时更新?

When are persisted computed columns updated?

运行SQL Server 2014MSDN 表示标记为 PERSISTED 的计算列的值为 "updated when any columns that are part of their calculation change"。他们指的是 table 的 整列 还是 实际行 ?

例如 如果我有一个 table T 和一个持久计算列 Bar 如下所示,Bar如果我在 T 中插入一个新行会被重新计算吗? (整个列确实发生了变化,但实际的行没有变化。)

CREATE FUNCTION dbo.Baz(@foo INT)
RETURNS INT
WITH SCHEMABINDING
AS
BEGIN
    RETURN @foo % 10 -- Could be more complex! E.g. SELECT ...
END
GO

CREATE TABLE T 
(
    ID INT IDENTITY(1,1) NOT NULL,
    Foo INT NOT NULL,
    Bar AS dbo.Baz(Foo) PERSISTED
)
GO

计算列意味着仅依赖于同一行中的其他列值(加上表达式、常量等)。因此,你的问题没有多大意义。

但是,有些人通过使用 UDF 做 "clever" 事情,以便他们可以访问其他 table 中的其他数据或同一 table 中的其他行作为他们的一部分计算列定义。 SQL 服务器不知道这个 "cleverness" 因此,如果 UDF 正在访问其他数据,不,不能保证为实际上不受此影响的任何行更新此类计算列的值DML 语句。