【问题标题】:I need to create a view that unions all tables based on their prefix (new tables added monthly)我需要创建一个根据前缀合并所有表的视图(每月添加新表)
【发布时间】:2012-11-29 21:43:48
【问题描述】:

我的客户使用的集成软件是从 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 语句。

关于如何解决这个问题还有其他好的想法吗?

【问题讨论】:

    标签: sql sql-server sql-server-2012


    【解决方案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
    

    【讨论】:

    • 完美。谢谢!现在我只需要把它变成一个以前缀作为参数的 proc,我会很高兴。其中有 5-6 个后缀相同,但前缀不同。
    • 我会设置一个作业在创建表后立即运行以更新视图。
    • @HLGEM 哪个数据库级触发器可以很好地处理。
    • @RichardTheKiwi 你有例子吗?那太好了!
    猜你喜欢
    • 2015-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-17
    • 2015-12-28
    • 2012-12-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多