web-dev-qa-db-ja.com

新しいテーブルを動的にUNIONするビューを作成する

名前の形式DDOS_WAF_REPORT(5または6桁のID番号)の複数のテーブルがあるdbo.DDOS_WAF_ACCOUNT_######という名前のデータベースがあります。

すべてのテーブルの構造はまったく同じです(列名と型の両方)。それらを一緒にUNION ALLするビューを作成したいと思います。さらに、後でデータベースに追加される同じタイプの新しいテーブルがあるため、データベース内のすべての既存のテーブルを「実行」してそれらを追加できるようにするビューが必要です(ビューの追加または作成)スクラッチ)。

テーブル名がハードコーディングされた単純なビューを作成しましたが、ビューを動的に作成するという問題にどのように対処するかが困難です。 SQL Server 2012を使用しています。

追加されるテーブルは、アカウントごとにAPIに対して実行される外部スクリプトの結果であるため、データベースに複数のテーブルが存在することは避けられません。実際に実行して新しいテーブル名を確認するスクリプトコードを作成する必要があると想定していましたが、その方法を理解するための例をいくつか見たかったのです。

5
Ariel Hayoun

カーソルを使用してSQLステートメントを準備してSQL文字列を作成し、sp_executesqlを使用して実行できます。

DECLARE @TableName nvarchar(400)
DECLARE @DynSQL nvarchar(MAX)
Set @DynSQL = ''

DECLARE cursor1 CURSOR FOR 
    select name
    from sys.tables
    where name like 'DDOS_WAF_ACCOUNT_%'

OPEN cursor1

FETCH NEXT FROM cursor1 INTO @TableName

WHILE @@FETCH_STATUS = 0
BEGIN
    -- Add the select code.
    Set @DynSQL = @DynSQL + 'Select * from ' + @TableName
    FETCH NEXT FROM cursor1
    INTO @TableName

    -- If the loop continues, add the UNION ALL statement.
    If @@FETCH_STATUS = 0
    BEGIN
        Set @DynSQL = @DynSQL + ' UNION ALL '
    END

END

CLOSE cursor1
DEALLOCATE cursor1

Print @DynSQL
exec sp_executesql @DynSQL

末尾近くのprintステートメントのおかげで、テキストモードを使用して、それが構築しているクエリを確認できます。

4
Steve Oakes