我们有一个应用程序将记录的数据存储在名为“ACManager
”的数据库和名为“Events_1
”的表中。
当此表达到一定数量的记录时,软件会创建另一个名为“Events_2
”的表。这随着数据的增长而持续。我需要能够自动查询这些数据,就像它在一个表中没有干扰一样。当应用程序动态创建新表时,使用UNION
最终会创建无效查询。请同时考虑性能。
所以我们需要将Query作为一个没有UNION的表:
Select *
FROM ACManager.Events_1 , ACManager.Events_2 , ACManager.Events_xxxx(as needed)
答案 0 :(得分:0)
使用动态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
答案 1 :(得分:0)
在此脚本中,您可以创建过程。在该过程的主体中使用动态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