【问题标题】:SQL Selecting tables with month names from date rangeSQL从日期范围中选择具有月份名称的表
【发布时间】:2012-01-14 10:28:22
【问题描述】:

我有名为:

Posts_August_2011
Posts_September_2011
Posts_October_2011
Posts_November_2011
Posts_December_2011
Posts_January_2012

我想创建UNION 表的存储过程,但这不是问题,因为我可以使用动态 SQL 将其粘合起来,我的问题是将月份和年份范围从 RANGE 获取到某种列表?然后检查表是否存在,合并它们并返回。

我会声明 2 个变量 @FromDate@Todate as datetime

为给定范围内的每个月份提取月份名称和年份的最佳方法是什么。

假设我给它一个范围@FromDate = '2011-10-18 14:16:27.000' and @ToDate = '2012-01-09 14:16:27.000' 有人可以建议如何提取月份和年份。

DECLARE @SqlToExecute as nvarchar(MAX);

使用 dinamyc SQL 是可以接受的,它可以在 while 循环中检查表的存在和 为范围内存在的每个表粘合到字符串:

@SqlToExecute += 'SELECT * FROM Posts_' + extractedMonthName + '_' + extractedYear + ' UNION ALL ';

【问题讨论】:

    标签: sql sql-server sql-server-2008


    【解决方案1】:

    这个问题是由糟糕的数据库设计引起的。您需要将所有这些表中的行存储在一个表 Posts 中,并带有 date 字段以指定月份和年份。

    要获取表的名称Posts_% 和从它们的名称中提取的日期,您可以使用以下代码:

    create table Posts_August_2011(i int)
    GO
    create table Posts_September_2011(i int)
    GO
    
    DECLARE @SqlToExecute varchar(max)
    DECLARE @FromDate date = '20110801', @ToDate date = '20110809'
    
    SELECT  name PostName, CAST(REPLACE(REPLACE(name,'Posts_','01/'),'_','/') as date) PostDate
    INTO #Posts
    FROM sys.tables
    WHERE name like 'Posts_%'
    
    SET @SqlToExecute=''
    
    SELECT @SqlToExecute += 'SELECT * FROM ' + PostName + ' UNION ALL '
    FROM #Posts
    WHERE PostDate>=@FromDate
          AND PostDate<@ToDate
    
    SELECT SUBSTRING(@SqlToExecute,1, LEN(@SqlToExecute)-10)
    
    DROP TABLE #Posts
    DROP TABLE Posts_August_2011
    DROP TABLE Posts_September_2011
    

    sys. tables 是系统目录视图,它为当前数据库中的每个表对象返回一行。

    【讨论】:

    • 这种方式设计为自定义分区,便于管理。
    • 正是我要找的东西,谢谢你我刚刚做了一些调整,你最后一次选择是选择 LITERAL,就像返回表中的第一个结果是:SELECT * FROM foo UNION ALL.. 我补充说:SET @ FinalToExec = SUBSTRING(@SqlToExecute,1, LEN(@SqlToExecute)-10) DROP TABLE #Posts1 EXEC(@FinalToExec)
    • @user1010609 感谢您的回复。很高兴能帮到你。
    【解决方案2】:

    您可以使用DATENAME(month,date)YEAR(date) 来构建您的月份和年份集。

    最简单的方法是创建一个包含年/月组合的小型查找表并过滤您的日期范围,然后只需循环结果并构建您的查询并执行。

    稍后您可以考虑将该表分区为每月分区,如果表的大小是您将它们拆分成这样的原因。

    【讨论】:

    • 是的,我目前正在构建 SP 以这种方式选择它们,这样做的主要原因是我不必因为大小而将它们全部合并
    【解决方案3】:

    是否可以将这些放在带有发布日期的单个 [发布] 表中?并在需要时对它们进行分区?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-24
      • 1970-01-01
      相关资源
      最近更新 更多