2

ログ データを " " というデータベースと " ACManager" というテーブルに保存するアプリケーションがありますEvents_1

このテーブルが一定数のレコードに達すると、ソフトウェアは " Events_2" という別のテーブルを作成します。これは、データが大きくなるにつれて続きます。このデータがすべて 1 つのテーブルにあるかのように、干渉なしに自動的にクエリできるようにする必要があります。を使用するUNIONと、アプリケーションによって新しいテーブルが動的に作成されるときに、最終的に無効なクエリが作成されます。パフォーマンスも考慮してください。

したがって、UNION を使用せずに 1 つのテーブルとしてクエリを実行する必要があります。

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

2 に答える 2

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

于 2013-07-30T15:36:05.070 に答える
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
于 2013-07-30T14:24:16.087 に答える