我有一堆数据表,如下所示:
您可以猜到,这些数字代表年份和月份。现在,我需要做的是使用存储过程仅联合所有必要的数据库表,具体取决于用户请求的开始日期和结束日期。 ie)从2014-01-01到2014-03-31
好吧,我可以拿出这种可耻的方法来解决它......
// Create a varchar variable to keep appending queries
// While start date month < end_date
// {
// Change start_date to yymm format
// Query += SELECT * FROM db_yymm WHERE Blah Blah
// Query += Union All
// start date = start date + 1 month
// }
// Delete the unnecessary last Union All
// Fire the query somehow.
技术上可行且有效的方法吗?或者有更好的方法吗?
答案 0 :(得分:6)
你正在走上正轨。这将使用动态SQL看起来像这样:
declare @startdate as date = '20140101' -- the start date should have day = 1
declare @enddate as date = '20140401' -- the end date should have day = 1
declare @date as date = @startdate
declare @sql as nvarchar(max) = N''
while @date <= @enddate
begin
-- build the query for each month
set @sql = @sql + N'SELECT * FROM db_table_'
+ replace(convert(nvarchar(7), @date, 111), N'/', N'_')
+ N' UNION ALL '
set @date = dateadd(month, 1, @date)
end
-- remove last N' UNION ALL '
if len(@sql) > 11
set @sql = left(@sql, len(@sql) - 11)
-- execute
exec sp_executesql @sql