来自sql动态表名

时间:2016-07-20 11:58:09

标签: sql sql-server-2008 dynamic foreach powerquery

我在Power Query下运行MS SQL以将一些数据导入Excel。

我们有几个项目和代码来自另一个查询,如下所示:

let
    Source = Projects[Code]
in
    Source

示例数据:

+------+
| code |
+------+
|    2 |
|    3 |
|    6 |
|   76 |
|   77 |
|   78 |
|   79 |
|   80 |
|   81 |
|   82 |
|   83 |
|   84 |
|   85 |
|   86 |
|   87 |
|   88 |
|   89 |
|   90 |
|   91 |
|   92 |
|   93 |
|   94 |
|   95 |
|   96 |
|   97 |
|   99 |
|  100 |
|  101 |
|  102 |
|  103 |
+------+

我想要做的是,为每个项目代码运行以下主查询。

let
    Source = Sql.Database("server", "logo", [Query="select '92' as [santiye] , stockref, DATE_ , AMOUNT, PRICE, total from LG_092_01_STLINE where cancelled = 0 and TRCODE =1"]),
    #"Merged Queries" = Table.NestedJoin(Source,{"stockref"},Query2,{"stockref"},"NewColumn",JoinKind.LeftOuter),
    #"Expanded NewColumn" = Table.ExpandTableColumn(#"Merged Queries", "NewColumn", {"CODE", "NAME"}, {"NewColumn.CODE", "NewColumn.NAME"}),
    #"Removed Columns" = Table.RemoveColumns(#"Expanded NewColumn",{"stockref"}),
    #"Reordered Columns" = Table.ReorderColumns(#"Removed Columns",{"NewColumn.CODE", "NewColumn.NAME", "DATE_", "AMOUNT", "PRICE", "total"}),
    #"Changed Type" = Table.TransformColumnTypes(#"Reordered Columns",{{"santiye", Int64.Type}}),
    #"Merged Queries1" = Table.NestedJoin(#"Changed Type",{"santiye"},Projects,{"Code"},"NewColumn",JoinKind.LeftOuter),
    #"Expanded NewColumn1" = Table.ExpandTableColumn(#"Merged Queries1", "NewColumn", {"Project Name"}, {"NewColumn.Project Name"}),
    #"Renamed Columns" = Table.RenameColumns(#"Expanded NewColumn1",{{"NewColumn.Project Name", "Project Name"}}),
    #"Reordered Columns1" = Table.ReorderColumns(#"Renamed Columns",{"santiye", "Project Name", "NewColumn.CODE", "NewColumn.NAME", "DATE_", "AMOUNT", "PRICE", "total"})
in
    #"Reordered Columns1"

SQL中的表名称应动态更改,并作为循环从其他查询中获取,并立即联合所有数据。

  

LG_092_01_STLINE = LG_ {code} _01_STLINE

     

[查询="选择' 92' as = [Query ="选择{code}为

我在SQL查询中做了类似的循环但是" exec()"在电源查询中不起作用。

while @cnt <= @maxrow

begin 

select @firma = nr from (SELECT ROW_NUMBER() over (order by logicalref asc) as NUM, NR FROM L_CAPIFIRM  ) nn where NUM = @cnt   
select @santiye = name from L_CAPIFIRM where NR = @firma

set @firma = RIGHT('000'+CAST(@firma AS VARCHAR(3)),3)
set @items = 'LG_' + convert(nvarchar(3),@firma) + '_ITEMS'
set @stline = 'LG_' + convert(nvarchar(3),@firma) + '_01_STLINE'

1 个答案:

答案 0 :(得分:0)

我认为在没有编写一行M代码的情况下这样做是非常简单的,因为看起来每个表中的列列表是一致的。

首先,我将连接到该服务器上的SQL数据库并选择任意随机表并编辑生成的查询。然后导航回Source步骤并在Data列中单击Database的行。这将为您提供该数据库中的表列表。

将列表过滤到所需的表格。您可以使用任何类型的过滤器执行此操作,或者对于您的场景,您可以通过使用加入类型:内部联接的合并来实现此目的。

现在点击Data列的列标题中的Expand按钮。现在,您将所选表中的每一行都附加在一起。您可以将下游转换添加到此查询中。

在没有一行代码的情况下完成4次点击。 Power Query是一个功能非常强大的数据集成工具。

Power Query对表格架构的变化有着惊人的容忍度 - 我从来没有见过类似的东西。它通常会增加常识性结果,例如为缺少列的表返回null,按名称匹配列(不是SQL UNION中的列位置),以及尝试转换具有冲突数据类型的列。它似乎从第一个表生成列列表。一如既往,仔细测试。