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

Node-Red使用OPENJSON解析JSON插入SQL Azure格式报错如何解决

报错原因
  • 第一个核心原因:Node-RED中经过JSON节点转换后,msg.payload已经是JavaScript对象类型,不是原始JSON字符串。你在SQL语句中直接使用{{{payload}}}拼接变量时,Node-RED会自动把JS对象转为[object Object]字符串,最终传入SQL的@data值为N'[object Object]'。该字符串的第1位(索引从0开始计数)字符为o,和报错信息完全吻合,自然无法被OPENJSON解析。
  • 第二个问题:就算传入了正确的JSON字符串,现有SQL的OPENJSON路径也不匹配。你拿到的JSON根节点是data数组,现有写法是直接读取根路径下的字段,无法匹配到数组内的结构。
修复方案
  1. 调整Node-RED侧数据格式:在将payload传入SQL Azure节点前,添加一个函数节点,执行代码将JS对象重新序列化为JSON字符串:
msg.payload = JSON.stringify(msg.payload);
return msg;

也可以直接去掉JSON解析节点,直接将API返回的原始JSON字符串传给SQL节点,避免重复序列化/反序列化。

  1. 修正SQL语句的OPENJSON解析路径,指定读取根节点下的data数组:
DECLARE @data NVARCHAR(MAX) = N'{{{payload}}}';

INSERT INTO TCarbonIntensity ([from], [to], [forecast], [actual], [index])
    SELECT [from], [to], [forecast], [actual], [index]
    FROM OPENJSON(@data, '$.data')
    WITH (
        [from] datetime '$.from',
        [to] datetime '$.to',
        [forecast] int '$.intensity.forecast',
        [actual] int '$.intensity.actual',
        [index] nvarchar(5) '$.intensity.index'
    );
补充优化建议

如果JSON内容中存在单引号,直接拼接字符串会导致SQL语法错误,建议优先使用SQL节点的参数化查询能力传参,不要手动拼接SQL字符串,避免注入风险和语法问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 22:54:03