我正在尝试填充一个日期表,其中包含未来35年的每个日期以及每天的信息。
我的ERP系统有一个会计年度表(GLRULE),它指定了每个特定年份的会计期间,因为许多公司不在日历月工作。
GLRule表包含每个句点的一条记录,如下所示:
fcbasis fcname fcstatus fdend fdstart flisadjust flisaudit fnnumber freval identity_column
A FY 2000 C 1/28/2000 0:00:00 1/1/2000 0:00:00 FALSE FALSE 1 FALSE 37
A FY 2000 C 2/25/2000 0:00:00 1/29/2000 0:00:00 FALSE FALSE 2 FALSE 38
A FY 2000 C 3/31/2000 0:00:00 2/26/2000 0:00:00 FALSE FALSE 3 FALSE 39
A FY 2000 C 4/28/2000 0:00:00 4/1/2000 0:00:00 FALSE FALSE 4 FALSE 40
A FY 2000 C 5/26/2000 0:00:00 4/29/2000 0:00:00 FALSE FALSE 5 FALSE 41
A FY 2000 C 6/30/2000 0:00:00 5/27/2000 0:00:00 FALSE FALSE 6 FALSE 42
无论如何,我可以使用与此类似的查询一次更新我的日期表一个字段:
UPDATE redfridaydates.dbo.testdates
SET [FISCAL_PERIOD] =
(SELECT fnnumber
FROM m2mdata01..glrule GLR
where DATE >= GLR.FDSTART and DATE <= GLR.FDEND)
有没有更好的方法一次更新多个字段?因为我没有加入,所以我不确定如何才能这样做。
答案 0 :(得分:4)
听起来你正在尝试更新的表每个日期都有一条记录。答案假定为。如果可以确保GL数据源没有重叠日期:
UPDATE T
SET T.[FISCAL_PERIOD] = GLR.fnnumber,
T.Foo = GLR.Bar,
T.Bat = GLR.Baz --etc.
FROM redfridaydates.dbo.testdates AS T
INNER JOIN m2mdata01..glrule AS GLR
ON T.[Date] BETWEEN GLR.FDSTART AND GLR.FDEND
如果您有兴趣,请点击proof of concept on some test data。
答案 1 :(得分:1)
您可以随时在更新查询中设置更多字段:
UPDATE TableName Set Field1 = (Select fnnumber From ....),
Field2 = (some other query or value), etc.
答案 2 :(得分:1)
也许循环一下您的日期表会是一个解决方案吗?
declare @myDate SmallDateTime
set @myDate = (Select MIN(DATE) FROM dbo.testdates)
declare @myFiscal int
WHILE @myDate is not null
BEGIN
--determine the fiscal period
--output a zero for missing fiscal periods
SET @myFiscal = isnull(
(
SELECT fnnumber
FROM m2mdata01..glrule GLR
WHERE @myDate >= GLR.FDSTART AND @myDate <= GLR.FDEND
),0)
--update the date table
UPDATE redfridaydates.dbo.testdates
SET fiscal_period = @fiscal
WHERE date = @myDate
--get the next date
--will be null once the loop reaches the end of the table
SET @myDate = (Select MIN(DATE) FROM dbo.testdates WHERE DATE > @myDAte)
END