【问题标题】:Return data before current month返回当前月份之前的数据
【发布时间】:2016-02-29 10:49:40
【问题描述】:

以下代码从 11 个表中返回数据。每个表都包含年份和月份。我需要使用 enddate 参数来检查只有表 todate 被拉出。因此,如果用户想要来自 201505 的数据,它应该 假设我们在 201510 月份,从 201510 开始,仅在 201509 之前提取所有表格。代码如下:

{

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

}

【问题讨论】:

  • 请标记使用的 dbms。 (看起来不像 ANSI SQL。)
  • 为什么同一种数据有不同的表?那看起来很可怕。应该只有一张桌子。如果可能,请更改此设置。然后检索数据将非常简单。
  • 我没有创建数据结构
  • 但是你可以改变它吗?还是有人改?这看起来更像是与 DBMS 对抗,而不是简单地使用它。
  • 您正在使用多个名称包含日期的表。这是一种非常不正统的做法,令人不悦。它被不了解关系数据库的绝望的 n00bs 或试图绕过软件中的硬件限制而不是购买更好的硬件的绝望的人使用。

标签: sql sql-server-2008


【解决方案1】:

您从 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

【讨论】:

  • 谢谢Thorsten,但我不确定如何将其放入我的代码中。这需要在while循环内。是否可以将 Zohar Peled 推荐到此链接,因为我无法访问聊天。 Zohar 帮助我完成了循环
  • 嗯,看起来您想检索表名,因此您在存储过程中编写了一个循环。我告诉你,你可以只使用一个查询。没有存储过程,没有循环。如果出于某种原因必须将其放入存储过程中,则使用查询创建一个游标并在循环中获取名称。这是一个示例:stackoverflow.com/questions/1943892/….
  • 这并不简单,因为我使用 openquery 来访问每个表,因为该服务器有限制。不幸的是我不能用那个方法,但还是谢谢你
  • 好的,很抱歉。无论如何,我的其他答案更好:-)
  • 哈哈!谢谢,是否可以将 Zohar Peled 推荐到此链接,因为我无法访问聊天。 Zohar 帮我完成了循环?
【解决方案2】:

我已经发布了一个解释如何检索表名的答案。

但最好改一下设计。将其设为一张表并为月份创建视图(以现在命名的表命名)。为视图提供而不是插入触发器,这样您就可以像以前一样使用选择、更新、插入和删除,但您也可以使用适当的表:

select * from xx_all_t where month >= @FirstTableMonth;

【讨论】:

    猜你喜欢
    • 2021-11-24
    • 1970-01-01
    • 1970-01-01
    • 2020-05-15
    • 1970-01-01
    • 1970-01-01
    • 2021-12-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多