名前の形式DDOS_WAF_REPORT
(5または6桁のID番号)の複数のテーブルがあるdbo.DDOS_WAF_ACCOUNT_######
という名前のデータベースがあります。
すべてのテーブルの構造はまったく同じです(列名と型の両方)。それらを一緒にUNION ALL
するビューを作成したいと思います。さらに、後でデータベースに追加される同じタイプの新しいテーブルがあるため、データベース内のすべての既存のテーブルを「実行」してそれらを追加できるようにするビューが必要です(ビューの追加または作成)スクラッチ)。
テーブル名がハードコーディングされた単純なビューを作成しましたが、ビューを動的に作成するという問題にどのように対処するかが困難です。 SQL Server 2012を使用しています。
追加されるテーブルは、アカウントごとにAPIに対して実行される外部スクリプトの結果であるため、データベースに複数のテーブルが存在することは避けられません。実際に実行して新しいテーブル名を確認するスクリプトコードを作成する必要があると想定していましたが、その方法を理解するための例をいくつか見たかったのです。
カーソルを使用して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ステートメントのおかげで、テキストモードを使用して、それが構築しているクエリを確認できます。