大家好,我现在已经挣扎了一段时间了!我有一些数据文件,其中包含日期,这些文件被转储到临时表中。我希望我的脚本/函数做的是读取登台表中每条记录的日期并移动到适当的表。现在我知道我可以很容易地使用一些静态插入,例如
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
答案 0 :(得分:4)
你走了:
CREATE TABLE dbo.Some_Meaningful_Descriptive_Name (
record_id CHAR(7) NOT NULL,
some_date DATETIME NOT NULL,
some_data VARCHAR(20) NOT NULL,
...
)
现在您的导入过程只需将它们放在表中即可。没有动态要求,也不需要每个月创建一个新表。
如果您真的需要让它们看起来分开,那么就可以在表格上创建视图:
CREATE VIEW dbo.Some_Meaningful_Descriptive_Name_2011_08
AS
BEGIN
SELECT
record_id,
some_data
FROM
dbo.Some_Meaningful_Descriptive_Name
WHERE
some_date >= '2011-08-01 00:00:00.000' AND
some_date < '2011-09-01 00:00:00.000'
END
如果您有这么多行需要将它们实际放入单独的表中,那将非常罕见。 (我们正在谈论数百万行的10个)。现在进行分区,即便如此,也可能没有必要。
将它们放入单独的表中将会使将来更难与它们合作。
答案 1 :(得分:3)
如果我理解你,你想生成具有动态变化的表名的INSERT
语句吗?
您可以将SQL查询构造为字符串,并使用EXEC
执行它:
DECLARE @sql nvarchar(MAX)
SELECT @sql = N'INSERT ' + @tableName + ' VALUES (...)'
EXEC (@sql)
实现数据路由的最简单方法是使用游标迭代临时数据,并在该循环中创建动态插入sql字符串。
然后使用单个EXEC
命令执行插入批处理。
答案 2 :(得分:2)
表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