根据条件

时间:2017-11-09 16:21:06

标签: sql-server ssis

我有以下查询,它将根据日期列的年份和季度创建表格。它将从2000年到今年。

在下一次运行中,我希望脚本仅从当前年度的最新季度创建表。因此,假设今年已经创建了第4季的表,我不希望我的脚本再次创建表。

它应该只为新的季度创建表。

declare @startyear int = 2000
declare @startQuarter int = 1
declare @sql nvarchar(max)
declare @tableName varchar(50)

while @startYear < year(getdate())
begin
    set @startQuarter = 1

    while @startQuarter < 5
    begin
        set @tableName = 'FinData' + cast (@startYear as varchar) + '_' + cast(@startQuarter as varchar);
        set @sql = '
            drop table [dbo].[' + @tableName + '];
            create table [dbo].[' + @tableName + '] ( calendarYear int, calendarQuarter int, companyid bigint not null, dataitemid bigint not null, dataitemvalue numeric(28,6), fiscalyear int, fiscalquarter int, periodenddate datetime, filingdate datetime, latestforfinancialperiodflag bit, latestfilingforinstanceflag bit );
            insert into [dbo].[' + @tableName + '] select calendarYear, calendarQuarter, companyid, dataitemid, dataitemvalue, fiscalyear, fiscalquarter, periodenddate, filingdate, latestforfinancialperiodflag, latestfilingforinstanceflag
            from openquery([gbips-i-db48d\sql2008r2],''select fp.calendarYear, fp.calendarQuarter, fp.companyid, fd.dataitemid, fd.dataitemvalue, fp.fiscalyear, fp.fiscalquarter, fi.periodenddate, fi.filingdate, fi.latestforfinancialperiodflag, fi.latestfilingforinstanceflag
              from [Xpressfeed_dev].dbo.ciqFinPeriod fp
              inner join [Xpressfeed_dev].dbo.ciqFinInstance fi on fi.financialPeriodId = fp.financialPeriodId
              inner join [Xpressfeed_dev].dbo.ciqFinInstanceToCollection fc on fc.financialInstanceId = fi.financialInstanceId
              inner join [Xpressfeed_dev].dbo.ciqFinCollection c on c.financialCollectionId = fc.financialCollectionId
              inner join [Xpressfeed_dev].dbo.ciqFinCollectionData fd on fd.financialCollectionId = c.financialCollectionId
              where YEAR(fi.periodenddate) = '+ cast(@startYear as varchar) +' and  DATEPART( quarter,fi.periodenddate)  = ' + cast(@startQuarter as varchar ) + ''')'  
        EXEC sp_executesql @sql 

        set @startQuarter += 1
    end

    set @startYear += 1;
end

例如,创建的表将是

    FinData2017_1
    FinData2017_2
    FinData2017_3
    FinData2017_4

请注意,我使用periodEndDate来确定年份和季度,而不是当前的系统年度。

我通过SSIS工作运行上面的脚本。我想根据条件创建表。下面的查询是我想在执行

之前检查的条件
select max(year(periodEndDate)) as Year from ciqFinInstance
select max(Datepart(quarter, periodEndDate)) as Quarter from ciqFinInstance

因此,将创建表以检查此列中的值。处理这个问题的最佳方法是什么?我需要循环运行脚本从2000年到当年插入记录,因为每次运行都会添加新的历史记录,但创建表不应该是此循环的一部分。

0 个答案:

没有答案