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

SQL Server 2016如何从JSON提取整数数组并用于更新操作

提取JSON中的Market ID并更新表的正确方法

嘿,我来帮你搞定这个SQL Server处理JSON数组的问题!你遇到的空值问题,根源是没告诉OPENJSON要把Markets当成JSON结构来处理,下面一步步给你讲清楚:

为什么之前的查询返回空值?

当你执行select j.Markets from openjson(@JSON) with(Markets nvarchar(max)) j时,SQL Server默认会尝试提取Markets对应的标量值(比如字符串、数字这种单个值),但Markets是一个数组(类型4确实代表数组,不是对象哦),不是标量,所以自然返回NULL。你需要加上AS JSON关键字,让SQL Server保留这个数组的JSON结构,这样才能继续解析。

正确提取Market ID的方法

这里有两种常用的方式:

方法1:先提取数组,再解析元素

DECLARE @JSON nvarchar(max) = N'{"Comments": "test", "Markets": [3, 151]}';

-- 提取所有Market ID
SELECT value AS MarketID
FROM OPENJSON(@JSON)
WITH (Markets nvarchar(max) AS JSON) j
CROSS APPLY OPENJSON(j.Markets);

这个方法先把Markets数组以JSON字符串的形式提取出来,再用CROSS APPLY配合OPENJSON拆分成单个的ID值(value字段就是数组里的每个元素)。

方法2:直接指定数组元素的类型

如果已经知道数组里的ID是整数,可以直接在嵌套的OPENJSON里指定类型,让结果更清晰:

DECLARE @JSON nvarchar(max) = N'{"Comments": "test", "Markets": [3, 151]}';

SELECT MarketID
FROM OPENJSON(@JSON)
WITH (
    Comments nvarchar(100), -- 顺便提取其他字段
    Markets JSON -- 用JSON类型或者nvarchar(max) AS JSON都可以
) j
CROSS APPLY OPENJSON(j.Markets)
WITH (MarketID int '$'); -- '$'代表数组当前元素的值

用提取的ID更新Market表

接下来就是你要的更新操作,把提取到的ID和Market表关联起来就行:

DECLARE @JSON nvarchar(max) = N'{"Comments": "test", "Markets": [3, 151]}';

UPDATE M
SET M.IsActive = 1 -- 替换成你实际要更新的字段和值
FROM Market M
INNER JOIN (
    -- 这里用上面的方法提取ID
    SELECT value AS MarketID
    FROM OPENJSON(@JSON)
    WITH (Markets nvarchar(max) AS JSON) j
    CROSS APPLY OPENJSON(j.Markets)
) AS MarketIDs ON M.ID = MarketIDs.MarketID;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:27:37