admin

动态表插入TSQL

sql

大家好,我已经为此苦苦挣扎了一段时间!我有一些带有日期的数据文件,这些文件被转储到临时表中。我希望我的脚本/函数要做的是读取登台表中每个记录的日期,然后移至适当的表。现在我知道我可以很容易地做到这一点,例如,使用一些静态插入物

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

阅读 165

收藏
2021-06-07

共1个答案

admin

表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
2021-06-07