Power Query中如何将Excel空白单元格作为NULL值传递给SQL查询
问题根因
Power Query读取空白单元格得到的是原生null值,使用字符串拼接SQL语句时,只要拼接链中出现null,最终生成的整个查询字符串就会变为null。Sql.Database方法收到无效空查询时,会默认返回目标库的所有表/视图列表,你写的SELECT逻辑根本没有被执行。
解决方案
方案1:Power Query层预处理空值(推荐)
直接在Power Query中将空值、空格值提前转换为你逻辑中用的-1标记,从根源避免空值拼接问题,同时还能处理用户输入的单引号避免SQL语法错误。
let Source = Excel.CurrentWorkbook(){[Name="GetValues"]}[Content], // 预处理Part参数:空值/空格转-1,转义单引号 pPart_Raw = Text.From(Source{1}[Column1] ?? ""), pPart = if Text.Trim(pPart_Raw) = "" then "-1" else Text.Replace(Text.Trim(pPart_Raw), "'", "''"), // 预处理Color参数 pColor_Raw = Text.From(Source{2}[Column1] ?? ""), pColor = if Text.Trim(pColor_Raw) = "" then "-1" else Text.Replace(Text.Trim(pColor_Raw), "'", "''"), Query = " DECLARE @pPart VARCHAR(100) = '"& pPart &"', @pColor VARCHAR(100) = '"& pColor &"' SELECT * FROM myTable WHERE (PartID = @pPart OR @pPart = '-1') AND (ColorID = @pColor OR @pColor = '-1') ", Target = Sql.Database("myServer", "myDatabase", [Query=Query]) in Target
说明:
??是空合并运算符,当单元格值为null时返回空字符串,避免出现原生null- 提前转义输入内容中的单引号,避免用户输入带单引号的值时SQL语法报错
- 原SQL中的ISNULL、判空逻辑可以直接移除,因为参数已经在Power Query层处理完成
方案2:传真正的NULL到SQL
如果需要把空白单元格作为真正的NULL传入SQL,修改参数拼接逻辑即可:
let Source = Excel.CurrentWorkbook(){[Name="GetValues"]}[Content], pPart_Raw = Text.From(Source{1}[Column1] ?? ""), pPart_SQL = if Text.Trim(pPart_Raw) = "" then "NULL" else "'"&Text.Replace(Text.Trim(pPart_Raw), "'", "''")&"'", pColor_Raw = Text.From(Source{2}[Column1] ?? ""), pColor_SQL = if Text.Trim(pColor_Raw) = "" then "NULL" else "'"&Text.Replace(Text.Trim(pColor_Raw), "'", "''")&"'", Query = " DECLARE @pPart VARCHAR(100) = "& pPart_SQL &", @pColor VARCHAR(100) = "& pColor_SQL &" SET @pPart = ISNULL(@pPart,'-1') SET @pColor = ISNULL(@pColor,'-1') SELECT * FROM myTable WHERE (PartID = @pPart OR @pPart = '-1') AND (ColorID = @pColor OR @pColor = '-1') ", Target = Sql.Database("myServer", "myDatabase", [Query=Query]) in Target
内容的提问来源于stack exchange,提问作者Jeff Brady
相关产品推荐
相关产品推荐

