You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Power Query报错:无法对文本与数字应用&运算符,如何嵌入数值参数到TSQL?

解决Power Query M中拼接数值参数到TSQL的类型错误问题

错误原因

报错We cannot apply operator & to types Text and Number.的核心原因是:你定义的TestID是数值类型,而M语言中&运算符仅支持文本(Text)类型之间的拼接,直接将数值与SQL字符串拼接会触发类型不匹配。


解决方案1:将数值参数转为文本后拼接

用Text.From()函数把数值类型的TestID转换为文本,再进行字符串拼接。修改后的M代码如下:

let 
    TestID = Excel.CurrentWorkbook(){[Name="TestID"]}[Content]{0}[Column1],
    // 将数值转为文本
    TestID_Text = Text.From(TestID),
    Source = Sql.Database("SERVERNAME", "DBNAME", 
    [Query="
SELECT *
from [POD01RAWDATA]
where 
time@timestamp 
between 
(select distinct max([time@timestamp]) from [POD01EVENTLOG] where [data_format_4] = 1 and [data_format_0] = "&TestID_Text&")
and 
(select distinct max([time@timestamp]) + 60 from [POD01EVENTLOG] where [data_format_4] = 1 and [data_format_0] = "&TestID_Text&")
"])
in
    Source

解决方案2:使用参数化查询(推荐,避免SQL注入)

直接字符串拼接存在SQL注入风险,更规范的方式是利用Sql.Database的Parameters参数实现安全的参数化查询,无需手动转换类型:

修改后的M代码

let 
    TestID = Excel.CurrentWorkbook(){[Name="TestID"]}[Content]{0}[Column1],
    Source = Sql.Database("SERVERNAME", "DBNAME", 
    [Query="
SELECT *
from [POD01RAWDATA]
where 
time@timestamp 
between 
(select distinct max([time@timestamp]) from [POD01EVENTLOG] where [data_format_4] = 1 and [data_format_0] = @TestID)
and 
(select distinct max([time@timestamp]) + 60 from [POD01EVENTLOG] where [data_format_4] = 1 and [data_format_0] = @TestID)
", 
    Parameters = [TestID = TestID]
    ])
in
    Source

说明

  • TSQL中用@TestID作为参数占位符
  • 在M代码的Parameters参数中传入键值对,键名需与TSQL中的占位符一致,值为你的TestID参数,Power Query会自动处理类型匹配,同时避免SQL注入风险。

内容的提问来源于stack exchange,提问作者JMC101

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 20:47:13