在while循环中迭代加入SQL

时间:2015-07-07 17:44:54

标签: sql-server while-loop left-join temp-tables

我知道在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不会随着最右边的列而增长。相反,它仍保留在列TRNAMERET_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'.

0 个答案:

没有答案