当持久化计算列更新时



运行SQL Server 2014。MSDN声明标记为PERSISTED的计算列的值"当作为其计算的一部分的任何列发生变化时更新"。它们指的是表的整个列还是实际行?

如果我有一个表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做了一些"聪明"的事情,这样他们就可以访问其他表中的其他数据,或者作为计算列定义的一部分访问同一表中的其他行。SQL Server没有意识到这种"聪明",因此,如果UDF正在访问其他数据,不,它不能保证更新这样一个计算列的值,任何行实际上不受DML语句的影响。

最新更新