我有以下查询,它将根据日期列的年份和季度创建表格。它将从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年到当年插入记录,因为每次运行都会添加新的历史记录,但创建表不应该是此循环的一部分。