我有一个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
公式列中的代码是否不正确?或者为什么会有错误?
答案 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())))
)