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

Sql server 在特定条件下更改计算列的值,sql-server,tsql,calculated-columns,Sql Server,Tsql,Calculated Columns,我有一个用于图书馆流通的表格,其中有一列名为Delay。此列是计算列,但应更改此列,直到IsReturned此表中的另一列的位等于0为止。这意味着延迟值应该更改,并且在成员将图书归还到库中之前,延迟值应该更高。如何生成此计算列公式? 我尝试了这个方法,但它不是一个有效的公式: dbo.CalculateDelay(Id,IsReturned,Delay) 功能是这样的: CREATE FUNCTION CalculateDelay ( @Id INT , @IsReturned BIT

我有一个用于图书馆流通的表格,其中有一列名为Delay。此列是计算列,但应更改此列,直到IsReturned此表中的另一列的位等于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

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

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

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()))) 
) 

你的意思不是一个有效的公式?问题出在哪里?@king.code,它只是给了我一个错误:“Circulation”表-验证列“Delay”的公式时出错。@TabAlleman,工作不正常,但我可以修复函数错误,但为什么它认为公式不正确?当您将函数用作计算列公式时,sql会尝试通过测试函数来验证它。如果函数不起作用,它将无法验证公式并给出您看到的错误。@TabAlleman,请参阅更新。。。错误在我给函数的值中。它解决了问题,但错误没有得到纠正。