SQL Server:动态联合加入

时间:2014-04-13 04:41:25

标签: sql-server

我有一堆数据表,如下所示:

  • db_table_2014_01
  • db_table_2014_02
  • db_table_2014_03
  • db_table_2014_04
  • ....

您可以猜到,这些数字代表年份和月份。现在,我需要做的是使用存储过程仅联合所有必要的数据库表,具体取决于用户请求的开始日期和结束日期。 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.

技术上可行且有效的方法吗?或者有更好的方法吗?

1 个答案:

答案 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