Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Ich muss eine Ansicht erstellen, die alle Tabellen basierend auf ihrem Präfix vereint (neue Tabellen werden monatlich hinzugefügt).

Sie können diesen Abfragebatch verwenden, um die Ansicht zu erstellen. Aber Sie müssen es ständig aktualisieren.

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);

Dies ist eine gespeicherte Prozedur, die den Namen der Basistabelle übernimmt und eine Ansicht dafür erstellt (ich habe den obigen Code in eine Prozedur verpackt, die einen Parameter übernimmt)

    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