运行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语句的影响。