在Excel的Odbc.Query()中传递Power Query变量/参数
实现Excel Power Query中ODBC查询的动态日期筛选
直接给你修正后的可运行代码,核心是把Excel单元格里的日期转换成ODBC要求的格式,再通过字符串拼接到SQL语句中,让数据库端完成筛选:
let // 读取Excel中命名为DATE_FROM的单元格日期 D_FROM1 = Excel.CurrentWorkbook(){[Name="DATE_FROM"]}[Content], D_FROM2 = Table.TransformColumnTypes(D_FROM1,{{"Column1", type date}}), D_FROM3 = D_FROM2{0}[Column1], // 转换为ODBC兼容的日期格式字符串 D_ODBC_DATE = "{d '" & Date.ToText(D_FROM3, "yyyy-MM-dd") & "'}", // 构建带动态日期的ODBC查询 Source = Odbc.Query( "dsn=My Server", "SELECT POPOINLineItem.documentDate, POPOINLineItem.postingDate, POPOINLineItem.reference, POStatusDefinition.name AS ""PO Status"" FROM POPOINLineItem POPOINLineItem, POStatusDefinition POStatusDefinition WHERE POPOINLineItem.myStatus = POStatusDefinition.oid AND ""PO Status"" = 'Entered' AND POPOINLineItem.postingDate >= " & D_ODBC_DATE & "" ) in Source
关键说明:
- 动态日期拼接:用
&把生成的ODBC格式日期({d 'YYYY-MM-DD'})直接拼接到SQL语句中,查询发送到数据库时会生成带实际日期的完整SQL,确保在数据库端完成筛选,不会拉取全量数据。 - SQL语法修正:
- 去掉了SELECT列末尾、FROM表列表末尾的多余逗号(这些会导致SQL执行报错)
- 带空格的别名
PO Status在WHERE子句中用双引号包裹(如果你的数据库是SQL Server,可换成[PO Status];MySQL用PO Status)
- Excel单元格要求:确保存日期的单元格命名为
DATE_FROM,且是单个单元格、格式为日期类型,Power Query能正常读取。
这样用户只需要修改DATE_FROM单元格的日期,刷新查询就能自动应用新的筛选条件,不需要改动Power Query代码。
内容的提问来源于stack exchange,提问作者DuckyShiny
相关产品推荐
相关产品推荐

