0

私のクライアントが使用している統合ソフトウェアは、RMSシステムからISAMファイルをプルし、すべてが同一のスキーマを持つ多数のテーブルを作成していますが、それでも、クライアントが使用するソフトウェアは、それらのマージをサポートしていません。

テーブル名の例を次に示します。

  • SOME_TABLE_XYZ_2012OCT
  • SOME_TABLE_ABC_2012OCT
  • SOME_TABLE_LMN_2012OCT
  • SOME_TABLE_XYZ_2012NOV
  • SOME_TABLE_ABC_2012NOV
  • SOME_TABLE_LMN_2012NOV

これらすべてをSOME_TABLEという名前の単一のビューにまとめ、データユニオンをすべてまとめる必要があります。新しい3文字のコードがあり、明らかに毎月新しいテーブルが作成される可能性があるため、動的である必要があります。

理想的には、SOME_TABLEという名前のビューを作成するSPが必要です。次に、SOME_TABLEからクエリを実行して、必要な作業を実行できます(ETLをSQL Server 2012データウェアハウスにスケジュールします)。SPにカーソルを返すだけでよいことはわかっていますが、ビューを作成すると、パフォーマンスと他のETLツールの使いやすさが必要な場合に、インデックス付きのビューにする柔軟性が得られます。

sys.tables(またはそれが何であれ)にクエリを実行し、そこから作成ビューのsqlステートメントを作成することを考えています。

これにアプローチする方法に関する他の明るいアイデアはありますか?

4

1 に答える 1

1

このクエリバッチを使用して、ビューを作成できます。しかし、あなたはそれを更新し続ける必要があります。

declare @v nvarchar(max) =
    (
        select stuff((
        select cast(' union all select * from ' as nvarchar(max)) + quotename(name)
          from sys.tables
         where name like 'SOME\_TABLE\____\_[0-9][0-9][0-9][0-9][a-Z][a-Z][a-Z]' escape '\'
           for xml path('a'), type
        ).value('.','nvarchar(max)'),1,11,'')
    );
set @v = 'CREATE VIEW SOME_TABLE AS ' + @v;
exec (@v);

これは、ベーステーブル名を受け取り、そのビューを作成するストアドプロシージャです(上記のコードをパラメーターを受け取るプロシージャにラップしました)

    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE PROCEDURE spCreateUnionedView
        @BaseTableName varchar(100)
    AS
    BEGIN
        SET NOCOUNT ON;

        declare @v nvarchar(max) =
        (
            select stuff((
            select cast(' union all select * from ' as nvarchar(max)) + quotename(name)
              from sys.tables
             where name like replace(@BaseTableName, '_', '\_') + '\____\_[0-9][0-9][0-9][0-9][a-Z][a-Z][a-Z]' escape '\'
               for xml path('a'), type
            ).value('.','nvarchar(max)'),1,11,'')
        );

        declare @s nvarchar(max) = 'DROP VIEW ' + @BaseTableName;
        exec (@s);

        set @v = 'CREATE VIEW ' + @BaseTableName + ' AS ' + @v;
        exec (@v);

    END
    GO
于 2012-11-29T21:53:57.247 に答える