【问题标题】:Table value being set as the value of another table depending on the day of the week根据星期几将表值设置为另一个表的值
【发布时间】:2013-02-20 11:43:48
【问题描述】:

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

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

提前致谢!

【问题讨论】:

    标签: sql sql-server-2008


    【解决方案1】:

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

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

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

    【讨论】:

    • 如果我对您的理解正确,这正是我已经尝试过的,当我意识到该函数不支持多行插入时出现了问题(这有时是如何将数据添加到table2)。我想我应该这么说 - 我现在将其添加到问题中
    • 如果您发布代码以尝试以这种方式插入,也许有人可以帮助您使其正常工作。
    • 您的编辑将作为最后的手段,我想 - 我正在考虑编辑整个问题,因为插入数据的方式是通过触发器(参见:StackOverflow)并添加它到最后会造成混乱。到目前为止非常感谢!
    • 我在插入时尝试执行此操作时过于复杂,现在我已经按照您的第一个建议让它工作了!干杯。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    • 2013-01-25
    • 2020-08-31
    • 2015-09-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多