在特定条件下更改计算列的值

时间:2014-12-31 14:58:15

标签: sql-server tsql calculated-columns

我有一个Library Circulation表,其中有一个名为“Delay”的列。此列是计算列,但应该更改,直到“IsReturned”(此表中的另一列为bit)等于0.这意味着延迟值应该更改并且更高,直到成员将书返回到图书馆。我该如何制作这个计算列公式? 我试试这个,但它不是一个有效的公式:

dbo.CalculateDelay(Id,IsReturned,Delay)

,功能就是这样:

CREATE FUNCTION CalculateDelay
(
  @Id INT ,
  @IsReturned BIT ,
  @LastDelay INT
)
RETURNS INT
AS
BEGIN
    IF ( @IsReturned = 0 )
        BEGIN
            DECLARE @delay INT = ( SELECT   ( DATEDIFF(minute,
                                                       DATEADD(day, [Time],
                                                          [StartDate]),
                                                       GETDATE()) )
                                   FROM     dbo.Circulation
                                   WHERE    Id = @Id
                                 )
            IF ( SQL_VARIANT_PROPERTY(@delay, 'BaseType') = 'int' )
                BEGIN
                    RETURN @delay
                END
            ELSE
                BEGIN
                    RETURN -5
                END
        END
    RETURN @LastDelay
END

如您所知,当“IsReturned”列等于1时,“延迟”列不应更改(我需要在数据库中保留延迟)。

更新:

我使用此代码执行该功能,并且它正常工作:

DECLARE @g INT 
EXEC @g = dbo.CalculateDelay 15 ,0 ,12000
SELECT @g

公式列中的代码是否不正确?或者为什么会有错误?

1 个答案:

答案 0 :(得分:0)

不允许引用计算列定义中的计算列。您需要记录项目签出和返回的时间,而不是使用BIT字段。您可以使用这些值来定义计算列。例如:

CREATE TABLE Checkouts
(
    CheckoutId INT IDENTITY NOT NULL PRIMARY KEY, 
    CheckedOut DATETIME NOT NULL DEFAULT (getdate()), 
    CheckedIn DATETIME NULL, 
    DelayDays AS (datediff(day, CheckedOut, COALESCE(CheckedIn, getdate()))) 
)