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

如何在SQL视图中使用OPENJSON函数?

在SQL Server视图中使用OPENJSON解析单个单元格的JSON

你遇到的问题确实很常见——变量声明在视图里是不允许的,所以得换一种方式把JSON字符串直接传入OPENJSON函数。下面给你两种常用的解决方案,根据你的场景选择:

1. 针对单个JSON对象(比如取TOP 1的情况)

直接把获取JSON的子查询作为OPENJSON的参数就行,注意子查询必须返回单个值(所以用TOP 1或者聚合函数如MAX都可以)。示例代码如下:

CREATE VIEW vw_JsonParsed
AS
SELECT *
FROM OPENJSON(
    (SELECT TOP 1 json_object FROM json_raw ORDER BY some_column) -- 加ORDER BY确保返回确定的行
) WITH (
    Id INT '$.id',
    Name NVARCHAR(50) '$.name',
    Email NVARCHAR(100) '$.email'
    -- 根据你的JSON结构定义对应字段
)

关键注意点:

  • 务必给TOP 1加上ORDER BY,否则每次返回的结果可能不一致,SQL Server不保证无ORDER BY的TOP 1返回顺序。
  • 如果你的表中只有一行JSON数据,也可以直接写SELECT json_object FROM json_raw(不用TOP 1),但前提是表确实只有一行,否则会因OPENJSON需要单个字符串参数而报错。

2. 针对表中每行的JSON对象(批量解析场景)

如果json_raw表有多行,每行都包含一个JSON对象单元格,想要批量解析所有行的话,应该用CROSS APPLY关联OPENJSON:

CREATE VIEW vw_AllJsonParsed
AS
SELECT raw.*, parsed.*
FROM json_raw raw
CROSS APPLY OPENJSON(raw.json_object) WITH (
    Id INT '$.id',
    Name NVARCHAR(50) '$.name',
    Email NVARCHAR(100) '$.email'
) parsed

这种方式会把每行的JSON解析后和原表行关联,返回所有解析后的结构化结果。

为什么变量方式在视图里不生效?

SQL Server的视图本质是存储的查询语句,不允许包含变量声明、赋值这类流程控制逻辑,所以你之前用@json变量的写法仅适用于存储过程、自定义函数或临时查询,视图里必须直接把JSON字符串的来源内嵌到OPENJSON的参数中。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 18:43:12