我有一个表,其中的列中有两列类型INT
,它们被称为:
ExpirationMonth
和
ExpirationYear
我想在此表中添加一个新列,其值将根据 和 的值ExpirationMonth
计算 ExpirationYear
。所以这个列将是一个计算列。
为此,我创建了一个用户定义的标量函数,它根据 和 的值计算该列的ExpirationMonth
值 ExpirationYear
。该函数的定义如下:
CREATE FUNCTION [dbo].[IsExpired]
(
@ExpirationMonth INT,
@ExpirationYear INT
)
RETURNS BIT
AS
BEGIN
DECLARE @Today DATE = GETDATE()
DECLARE @PreviousMonth INT = MONTH(@today)-1
DECLARE @CurrentYear INT = YEAR(@today)
DECLARE @IsExpired BIT = 0
IF(@ExpirationYear<@CurrentYear OR
(@ExpirationYear=@CurrentYear AND @ExpirationMonth<=@PreviousMonth))
SET @IsExpired = 1
RETURN @IsExpired
END
最初,我尝试添加如下列:
ALTER Table_Name
ADD IsExpired AS [dbo].[IsExpired]([ExpirationMonth], [ExpirationYear]) PERSISTED
我收到以下错误:
无法保留表“Table_Name”中的计算列“IsExpired”,因为该列是不确定的。
我PERSISTED
从上述语句中删除了它,然后再次运行它。然后我注意到该列已添加了预期值。
我的问题是,如果可能的话,我怎样才能使这个专栏持久化?
我意识到这个错误的原因是GETDATE
函数中IsExpired
函数的使用。由于GETDATE
不是确定性的,所以IsExpired
不是确定性的。
但是,我看不出我们如何使这个函数 ,IsExpired
具有确定性,并因此将计算列定义为持久化(如果可能的话)。
你能告诉我这是否可能,如果是的话,我该怎么做。