0

我有两个表,table1包含“用户名”和另外 7 个包含一周中每一天的值的列。table2包含三列,“用户名”、“日期”和第三列,我希望将其设置table1为与插入行的日期对应的“星期几”列。第二个表每天为每个用户更新一个新行。

[我希望这是有道理的!]

最初,我正在研究使用计算列的可能性,该列调用一个返回等于星期几的值的函数:

[dbo].[functionName]
(
    @colUsername varchar(25),
    @colDate date
)
RETURNS numeric(18, 0)
AS
BEGIN
    DECLARE @result numeric(18, 0)


    SELECT @result = CASE DATEPART(dw, @colDate)
        WHEN 1 THEN (SELECT SUNDAY FROM dbo.table1 WHERE USERNAME = @colUsername)
        WHEN 2 THEN (SELECT MONDAY FROM dbo.table1 WHERE USERNAME = @colUsername)
        WHEN 3 THEN (SELECT TUESDAY FROM dbo.table1 WHERE USERNAME = @colUsername)
        WHEN 4 THEN (SELECT WEDNESDAY FROM dbo.table1 WHERE USERNAME = @colUsername)
        WHEN 5 THEN (SELECT THURSDAY FROM dbo.table1 WHERE USERNAME = @colUsername)
        WHEN 6 THEN (SELECT FRIDAY FROM dbo.table1 WHERE USERNAME = @colUsername)
        WHEN 7 THEN (SELECT WORKINGSATURDAY FROM dbo.table1 WHERE USERNAME = @colUsername)
    END


    RETURN @result
END

并被设置为计算列,如下所示:

ALTER TABLE dbo.table2 ADD
    COLNAME AS dbo.functionName(USERNAME, DATE)
GO

这可以正常工作并且正如预期的那样,但是,因为它是一个计算列,当值发生table1变化时,所有值也会更新,table2而我需要旧值保持静态,并且table1只将更新后的值添加到的新行table2

我正在寻找有关如何实现这一目标的建议。

提前致谢!

4

1 回答 1

1

完成此操作的最简单方法可能是仅使用您编写的相同函数,但在您的插入中调用它table2并且不计算列。

如果您有一个带有计算列的有效插入,并且确实无法让插入与作为插入的一部分完成的计算一起工作,那么解决它的一种相当老套的方法可能是在插入时触发table2将计算值复制到另一列。然后,您将在同一张表中获得变化的值和稳定的值。

或者在table2调用您的函数时使用插入触发器来填充值,您应该能够返回到只有一列具有稳定值的列。

于 2013-02-20T12:00:33.450 回答