2011-09-13 67 views
2

大家好我一直在努力这一段时间了!我有一些数据文件中包含日期,这些文件被转储到临时表中。我想我的脚本/函数要做的是读取登台表中每条记录的日期并移动到适当的表格中。现在我知道,但是我希望它是动态的,我能做到这一点很容易只是用一些静态的刀片,例如动态表插入TSQL

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 

回答

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('''[email protected]+''', ''U'') is null 
BEGIN 
Declare @sql2 varchar(max) 
SET @sql2 = ''SELECT * INTO '[email protected]+' 
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 
+0

谢谢,这正是我之后的:) –

3

如果我理解你的权利,你想生成INSERT陈述了具有动态变化表名?

您可以构建你的SQL查询语句的字符串,并与EXEC执行:

DECLARE @sql nvarchar(MAX) 
SELECT @sql = N'INSERT ' + @tableName + ' VALUES (...)' 

EXEC (@sql) 

来实现你的数据路由最简单的方法是用游标来遍历暂存数据并创建动态插入SQL字符串在那个循环中。

然后用单个EXEC命令执行插入批处理。

+0

是从本质上说,这就是我想要做的。但是它需要读取每条记录的日期字段。在临时表中可能有2011-08和2011-09的数据,但我想要适当的数据去适当的表。所以只有2011-08的数据进入2011-08的表,2011-09的数据只有2011-09的数据。 –

+0

我已经编辑了我的答案:用游标在迭代表中迭代,并为每个数据行创建一个'INSERT' – Jan

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 

这是怎么回事,当你有,你需要真正把它们放到单独的那么多行是相当罕见表。 (我们正在说数十万行)。现在进行分区,即使这样也可能没有必要。

将它们放在不同的表格中会让它在将来更难与它们合作。

+0

是的,修复糟糕的设计。 +1,000,000 – HLGEM