表值被设置为另一个表的值,具体取决于星期几

时间:2013-02-20 11:43:48

标签: sql sql-server-2008

我有两个表,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的新行。

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

提前致谢!

1 个答案:

答案 0 :(得分:1)

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

如果你有一个带有计算列的工作插入,并且实际上无法使插入与作为插入的一部分进行的计算一起工作,那么解决它的一种相当狡猾的方式可能是 - 在table2上插入触发器,将计算值复制到另一列。然后,您将在同一个表中获得更改的值和稳定的值。

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