我有两个表,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
的新行。
我正在寻找有关如何实现这一目标的建议。
提前致谢!
答案 0 :(得分:1)
实现此目的的最简单方法可能是使用您编写的相同函数,但在插入table2
中调用它并且不计算列。
如果你有一个带有计算列的工作插入,并且实际上无法使插入与作为插入的一部分进行的计算一起工作,那么解决它的一种相当狡猾的方式可能是 - 在table2
上插入触发器,将计算值复制到另一列。然后,您将在同一个表中获得更改的值和稳定的值。
或者table2
上有一个插入触发器,调用你的函数来填充值,你应该能够只返回一个具有稳定值的列。