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 回答