现有表A数据如下----------------------------
datetime      value
2010-03-01     33
2010-03-02     35
..................
2011-01-03     35
----------------------------
其中datetime字段是日期类型。
因为现在表中数据太多,我想将这个表的数据分割为多个表存储,分割后表名为“A+年份+月份”的格式,如“A201003”。现在想写一个存储过程来分割这个表,请问有没有什么好的方法。

解决方案 »

  1.   

    declare @i int
    declare @table varchar(10)
    declare @rq varchar(6)
    select CONVERT(varchar(6),time,112) AS rq,ROW_NUMBER()OVER(ORDER BY CONVERT(varchar(6),time,112)) AS rn into #t from tb group by CONVERT(varchar(6),time,112) ORDER BY CONVERT(varchar(6),time,112)
    select @i=COUNT(*) from #t
    while @i>0
    begin
         select @rq=rq from #t where rn=@i
         set @table='A'+@rq
         exec ('SELECT * INTO '+@table+' FROM tb WHERE CONVERT(varchar(6),time,112)='+@rq+'')
         SET @i=@i-1
    end
      

  2.   

    create table data
    (
    date datetime,
    value int
    )
    insert into data
    select '2010-03-01', 1 union all
    select '2010-03-02', 2 union all
    select '2010-04-01', 3 union all
    select '2010-05-01', 4
    select * from data
    ------------------------------
    CREATE PROCEDURE proc_month
    AS
    DECLARE @year INT
    DECLARE @month INT
    DECLARE @table_name VARCHAR(100) DECLARE cursor_month CURSOR FOR
      SELECT DISTINCT year = DATEPART(YEAR, date), month = DATEPART(MONTH, date) FROM data OPEN cursor_month
    FETCH NEXT FROM cursor_month INTO @year, @month WHILE @@FETCH_STATUS = 0
    BEGIN
    SET @table_name = 'A'+ CAST(@year AS VARCHAR(4)) + RIGHT('0' + CAST(@month AS VARCHAR(2)), 2)
    EXEC('SELECT * INTO ' + @table_name + ' FROM data WHERE DATEPART(YEAR, date) = ' + @year + ' AND DATEPART(MONTH, date) = ' + @month)
    FETCH NEXT FROM cursor_month INTO @year, @month
    END CLOSE cursor_month
    DEALLOCATE cursor_month 

    --test
    EXEC proc_monthSELECT * FROM A201003
    SELECT * FROM A201004
    SELECT * FROM A201005
      

  3.   

    select * into t_201003 from tb where convert(varchar(7),datetime,120) = '2010-03'
    select * into t_201004 from tb where convert(varchar(7),datetime,120) = '2010-04'
    ...