我有名为:
的表Posts_August_2011
Posts_September_2011
Posts_October_2011
Posts_November_2011
Posts_December_2011
Posts_January_2012
我想创建UNION
表的存储过程,但这不是问题,因为我可以使用动态SQL来粘合它,我的问题是将RANGE的Months和Year 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 ';
答案 0 :(得分:2)
此问题是由错误的数据库设计引起的。您需要将所有这些表中的行存储在一个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是系统目录视图,它为当前数据库中的每个表对象返回一行。
答案 1 :(得分:0)
您可以使用DATENAME(month,date)
和YEAR(date)
来构建您的月份和年份。
最简单的方法是创建一个具有年/月组合并过滤日期范围的小型查找表,然后循环结果并构建查询并执行。
稍后您可以查看将该表分区为每月分区,如果表的大小是使您将它们拆分的原因。
答案 2 :(得分:0)
是否可以将这些内容放在一个包含发布日期的[Post]表中?如果需要,可以对它们进行分区吗?