2012-01-14 89 views
1

我有表名为:SQL选择具有月份名称表,从日期范围

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 '; 

回答

2

此问题是由不良引起的数据库设计。您需要将所有这些表中的行存储在一个表Postsdate字段中,以指定月和年。

要想从他们的名字,你可以使用下面的代码提取表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>[email protected] 
     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是返回一个排在当前数据库中每个表的对象系统目录视图。

+0

它被设计成自定义分区和更容易管理的方式。 – formatc 2012-01-14 12:01:55

+0

正是我在找什么,谢谢我只是做了一些调整,你最后选择是选择LITERAL像第一个结果在返回的表是:SELECT * FROM foo UNION ALL ..我补充说: SET @FinalToExec = SUBSTRING(@ SqlToExecute,1,LEN(@SqlToExecute)-10) DROP TABLE#Posts1 EXEC(@FinalToExec) – formatc 2012-01-14 12:48:05

+0

@ user1010609谢谢你的回复。我很高兴我能帮助你。 – 2012-01-14 15:21:57

0

您可以使用DATENAME(month,date)和来建立月份和年份。

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

对于以后你可以考虑将表分成每月分区,如果表的大小是什么让你像这样分割它们。

+0

是的,我现在正在建造SP来选择它们,这样做的主要原因是我不必将它们全部结合起来,因为它的大小 – formatc 2012-01-14 12:28:58

0

是否可以将这些放在一个带有发布日期的[Post]表中?如果你需要分割它们吗?

相关问题