表连接动态表名称

时间:2014-09-03 03:33:42

标签: sql sql-server tsql join

我需要在30天内从一组表中检索结果。

数据库似乎创建了名为monitorCounterLog的新表,日期结束,然后删除30天以外的任何内容。

EG: dbo.monitorCounterLog20140903今天在我所在地的日期。然后将这些日期向后重复30天。

EG:
dbo.monitorCounterLog20140903
dbo.monitorCounterLog20140902
dbo.monitorCounterLog20140901
dbo.monitorCounterLog20140831
dbo.monitorCounterLog20140830

等等......

我需要达到类似以下目的:

SELECT *

  FROM monjtorCounterLog[30_days_worth_of_table_dates] ml 
       INNER
       JOIN machNameTab mn
         ON mn.agentGuid = ml.agentGuid

 WHERE [stuff...]

这需要将30个表中的所有数据联合起来。

我获得了一些动态SQL(没有经验),但我不知道如何根据需要将其加入其他表。

    DECLARE @mCounterLog NVARCHAR(MAX)

    SELECT  @mCounterLog = STUFF((SELECT ' UNION ALL SELECT * FROM ' +st.name AS [text()]

      FROM  sys.tables st

     WHERE  (st.name LIKE 'monitorCounterLog[0-9]%' OR st.name = 'monitorCounterLog')
       FOR  XML PATH('')), 1, 11, '');

       EXEC sp_executesql @mCounterLog

我可以在这里做什么来实现动态SQL之外的连接?

将动态SQL插入临时表,然后加入结果,还是有更好的方法来解决这个问题?

很少使用正确的语法。

1 个答案:

答案 0 :(得分:3)

代码中的@mCounterLog变量将包含以下内容:

SELECT * FROM monitorCounterLog20140903 
UNION ALL
SELECT * FROM monitorCounterLog20140902
UNION ALL
SELECT * FROM monitorCounterLog20140901 
UNION ALL
SELECT * FROM monitorCounterLog20140831 
etc.

(我已插入换行符以提高可读性。您的代码生成一行代码)

因此,要将其与其他表连接,请在将变量传递给sp_execute之前执行此操作:

SET @mCounterLog = N'SELECT * FROM (' + @mCounterLog
SET @mCounterLog = @mCounterLog + N') ml INNER JOIN achNameTab mn 
          ON mn.agentGuid = ml.agentGuid
          WHERE [stuff...]'
EXEC sp_executesql @mCounterLog

基本上你的大UNION ALL查询成为ml别名的子查询