【问题标题】:Need to Query Tables that are dynamically created需要查询动态创建的表
【发布时间】:2013-07-30 17:26:20
【问题描述】:

我们有一个应用程序将记录的数据存储在名为“ACManager”的数据库和名为“Events_1”的表中。

当此表达到一定数量的记录时,软件会创建另一个名为“Events_2”的表。随着数据的增长,这种情况仍在继续。我需要能够自动查询这些数据,就好像它们都在一个表中一样而不受干扰。当应用程序动态创建新表时,使用UNION 最终会创建无效查询。还请考虑性能。

所以我们需要在没有UNION的情况下作为一张表查询:

Select *
FROM ACManager.Events_1 , ACManager.Events_2 , ACManager.Events_xxxx(as needed)

【问题讨论】:

    标签: sql dynamic


    【解决方案1】:

    使用动态 sql。试试这个

    DECLARE @query VARCHAR(MAX)
    SET @query='Select *
    FROM SELECT STUFF((SELECT  '','' + name
            from sys.tables where name like ''Events%''
            FOR XML PATH('''')), 1, 1, '''') '
    
    EXEC @query
    

    【讨论】:

    • 理想情况下,因为这些表将在无数报告中被引用,所以我想创建一个“VIEW”,我可以根据需要进行查询。
    • 在上面的查询中有什么需要自定义的吗?它不起作用。
    • 试试这样EXEC sp_executesql @query
    【解决方案2】:

    在此脚本中,您创建过程。在程序的主体中使用动态 sql,它构建 sql 语句然后运行该语句

    CREATE PROCEDURE dbo.getEvents
    AS
    DECLARE @dml nvarchar(max) 
    SELECT @dml = COALESCE(@dml + ' UNION ALL SELECT * FROM ', 'SELECT * FROM ') 
                  + QUOTENAME(s.name) + '.' + QUOTENAME(t.name) 
    FROM sys.schemas s INNER JOIN sys.tables t ON s.schema_id = t.schema_id                   
    WHERE s.name = 'dbo' AND t.name LIKE 'event%'
    --PRINT @dml
    EXEC sp_executesql @dml
    

    SQLFiddle上查看演示

    【讨论】:

    • 谢谢。这很好用。有没有办法把它变成一个“视图”来简化我的报告?
    • 您不能在 VIEW 中使用动态 SQL,也不能调用存储过程。阅读这篇文章stackoverflow.com/questions/653714/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-24
    • 2017-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-12
    • 2015-10-01
    相关资源
    最近更新 更多