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数组,现有写法是直接读取根路径下的字段,无法匹配到数组内的结构。
修复方案
- 调整Node-RED侧数据格式:在将payload传入SQL Azure节点前,添加一个函数节点,执行代码将JS对象重新序列化为JSON字符串:
msg.payload = JSON.stringify(msg.payload); return msg;
也可以直接去掉JSON解析节点,直接将API返回的原始JSON字符串传给SQL节点,避免重复序列化/反序列化。
- 修正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
相关产品推荐
相关产品推荐

