Sql server 在特定条件下更改计算列的值
我有一个用于图书馆流通的表格,其中有一列名为Delay。此列是计算列,但应更改此列,直到IsReturned此表中的另一列的位等于0为止。这意味着延迟值应该更改,并且在成员将图书归还到库中之前,延迟值应该更高。如何生成此计算列公式? 我尝试了这个方法,但它不是一个有效的公式: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
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,请参阅更新。。。错误在我给函数的值中。它解决了问题,但错误没有得到纠正。