2015-11-26 25 views
-1

以下代码从11个表中返回数据。每个表格包含年份和月份。我需要使用enddate参数来检查是否只有表格todate被拉出。因此,如果用户从201505想要的数据应该 撤出所有表只能做到201509从201510个表不存在假设我们在下面201510.代码的一个月:返回当前月份之前的数据

{ 

declare 
@enddate varchar(6), 
@FirstTableMonth int =201505, 
@Table_Name sysname, 
@TableMonth int, 
@end int, 
@CurrentMonth int = 0, 
@NextYearMonth int = 1 

set @enddate = 201611 

WHILE @CurrentMonth < 11 
BEGIN 

    SELECT @TableMonth = CASE WHEN (@FirstTableMonth + @CurrentMonth) % 100 < 13 THEN 
           @FirstTableMonth + @CurrentMonth 
          ELSE 
           @FirstTableMonth + 100 - (@FirstTableMonth % 100) + @NextYearMonth 
          END, 
        @NextYearMonth = CASE WHEN (@FirstTableMonth + @CurrentMonth) % 100 < 13 THEN 
            @NextYearMonth 
           ELSE 
            @NextYearMonth + 1 
           END, 
        @end = case when @enddate 
        @Table_Name = 'xx_'+CAST(@TableMonth as varchar)+'_T' 

        SET @CurrentMonth = @CurrentMonth + 1 
        print @Table_Name; 
END 

} 
+1

请标记使用DBMS。 (看起来不像ANSI SQL。) – jarlh

+0

为什么你对同一类型的数据有不同的表?那看起来很可怕。应该只有一个表。如果可能的话改变它。然后检索数据将非常简单。 –

+0

我没有创建数据结构 –

回答

0

你从INFORMATION_SCHEMA所有的表名.TABLES。所以只要你的申请标准,让他们:

select table_name 
from information_schema.tables 
where table_type = 'BASE TABLE' 
and table_name like 'xx\_______\_T' escape '\' 
and table_name >= 'xx_' + CAST(@FirstTableMonth as varchar) + '_T'; 

SQL小提琴:http://www.sqlfiddle.com/#!6/7b4f5/2

+0

谢谢Thorsten,但我不知道如何把它放在我的代码中。这需要在while循环内。是否有可能将Zohar Peled引用到此链接中,因为我无法访问聊天。 Zohar帮我处理循环 –

+0

好吧,它看起来像你想要检索表名,所以你在存储过程中写了一个循环。我告诉你,你可以用这个简单的查询。没有存储过程,没有循环。如果由于某种原因必须将其放入存储过程中,请使用查询创建一个游标并在循环中获取名称。这里是一个例子:http://stackoverflow.com/questions/1943892/sql-server-print-select-print-a-select-query-result。 –

+0

它并不那么简单,因为我使用openquery来访问每个表,因为该服务器有限制。不幸的是,我不能使用这种方法,但无论如何谢谢你 –

0

我已经张贴的答案解释如何检索表名。

但是,改为改为设计会更好。将它制作成一张表并为这些月份创建视图(命名为现在命名的表)。与INSTEAD-OF INSERT触发器时提供意见,所以你可以使用选择,更新,插入和以前一样删除,但你也不得不相应表一起工作:

select * from xx_all_t where month >= @FirstTableMonth; 
相关问题