持久计算列何时更新?
When are persisted computed columns updated?
运行SQL Server 2014
。 MSDN 表示标记为 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 语句。
运行SQL Server 2014
。 MSDN 表示标记为 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 语句。