大家好,我已经为此苦苦挣扎了一段时间!我有一些带有日期的数据文件,这些文件被转储到临时表中。我希望我的脚本/函数要做的是读取登台表中每个记录的日期,然后移至适当的表。现在我知道我可以很容易地做到这一点,例如,使用一些静态插入物
INSERT INTO TABLE_2011_08 WHERE Datafields = 2011_08
但是我希望它是动态的,因此我在考虑某个函数/存储过程的原理,以传递每个记录的日期。但是,我的大脑为此融化了!
登台表中的数据记录可能是这样的:-
RecordA 2011-08-30 Data Data Data RecordB 2011-08-31 Data Data Data RecordC 2011-09-01 Data Data Data RecordD 2011-09-02 Data Data Data
表T与您的表相似,我在表中填充了接近您的测试数据,如果不存在,则会创建您填充的表。
尝试重新创建表
CREATE TABLE T(name varchar(10), date datetime) insert t values('RecordA','2011-08-30') insert t values('RecordB','2011-08-31') insert t values('RecordC','2011-09-01') insert t values('RecordD','2011-09-02')
如果需要,此语法将创建并填充诸如TABLE_YYYY_MM之类的表。YYYY和MM是找到表T的任何组合
Declare @tablename varchar(64) Declare @sql as varchar(max) Declare @d as datetime Declare dCursor CURSOR FAST_FORWARD FOR SELECT DISTINCT dateadd(month, datediff(m, 0, date), 0) date from t OPEN dCursor FETCH NEXT FROM dCursor INTO @d WHILE @@FETCH_STATUS = 0 BEGIN SET @tablename = '[TABLE_'+replace(CONVERT(VARCHAR(7), @d, 121), '-', '_') + ']' SET @SQL = 'if OBJECT_ID('''+@tablename+''', ''U'') is null BEGIN Declare @sql2 varchar(max) SET @sql2 = ''SELECT * INTO '+@tablename+' FROM t WHERE 1 = 2'' EXEC(@sql2) END INSERT INTO '+ @tablename+' SELECT * FROM t WHERE datediff(m, 0, date)=' + CAST(datediff(m, 0, @d) AS VARCHAR(10)) EXEC(@SQL) FETCH NEXT FROM dCursor INTO @d END CLOSE dCursor DEALLOCATE dCursor