我知道在SQL代码中应用while
循环不是最佳做法,但我无法想象一下它的方法。
我有一组不断增长的历史表,我想使用一个公共ID来汇总和加入。所有这些历史表都具有匹配的结构。
表名包含月份和年份;我遍历在两个句点之间找到的所有表格 - 使用固定时间戳@StartDate
确定,时间戳@EndDate
通过GETDATE()
。
while
循环旨在从每个历史文件中不断追加其他列。每次迭代有一个月,每列包含相关月份的摘要。
问题是,每个left join
似乎都会删除上一次迭代中的内容。我使用条件语句来确定临时表是否存在,如果不存在,则使用select ... into
语句构建它,如果是,则使用insert into
语句。
以下是我所拥有的:
while @MonthCount > 0
begin
select @Month = DateSuffix from @DateTable where Row = @MonthCount
select @Table = table_name from information_schema.tables where table_name like concat('USA_RETHHDs_%', @Month)
if @Table is not null
begin
if object_id('tempdb.dbo.#RETHHDS', 'U') is not null
drop table #RETHHDS
create table #RETHHDS
(BUC_CD varchar(12),
RET_BKD_HH_COUNT int)
select @Table = concat('dbo.', @Table)
set @sql =
'insert into #RETHHDS
select BUC_CD, count(distinct SK_HH_ID) as RET_BKD_HH_COUNT from ' + @Table +
' group by BUC_CD'
execute SP_EXECUTESQL @sql;
if object_id('tempdb.dbo.#HISTORICAL_TABLE', 'U') is null
begin
select #USA_BRANCHCATALOGUE.TR, #USA_BRANCHCATALOGUE.NAME, #RETHHDS.RET_BKD_HH_COUNT into #HISTORICAL_TABLE
from #USA_BRANCHCATALOGUE
left join #RETHHDS
on #USA_BRANCHCATALOGUE.TR = #RETHHDS.BUC_CD
end
else
begin
insert into #HISTORICAL_TABLE
select #USA_BRANCHCATALOGUE.TR, #USA_BRANCHCATALOGUE.NAME, #RETHHDS.RET_BKD_HH_COUNT
from #USA_BRANCHCATALOGUE
left join #RETHHDS
on #USA_BRANCHCATALOGUE.TR = #RETHHDS.BUC_CD
end
select * from #HISTORICAL_TABLE
end
select @MonthCount = @MonthCount - 1
end
当我循环播放时,#HISTORICAL_TABLE
不会随着最右边的列而增长。相反,它仍保留在列TR
,NAME
和RET_BKD_HH_COUNT
中。
如果有一种简单的方法可以将相应的月份附加到RET_BKD_HH_COUNT
字段,则可以获得积分。但是,当我执行以下操作时,
set @sql =
'create table #RETHHDS
(BUC_CD varchar(12),
RET_BKD_HH_COUNT_' + @Month + ' int)'
execute SP_EXECUTESQL @sql;
我收到以下消息:
Invalid object name '#RETHHDS'.