SQL存储过程从单字段JSON表生成视图报错:Incorrect syntax near 'Json1'
解决SQL存储过程创建JSON视图的语法错误问题
咱们先拆解下你遇到的问题:你写的存储过程报错,核心原因有两个——动态SQL的作用域隔离和源表JSON处理逻辑不对。
错误原因解析
- 作用域问题:你在动态SQL
EXEC('CREATE VIEW Json1 AS SELECT * FROM SM')里引用的SM,是外层SELECT语句的结果集别名,但动态SQL有自己独立的执行上下文,根本看不到外层的SM,这就导致了语法错误。 - 源表处理错误:你的源表
FoodSara_tbl本身就是单字段存储JSON的表,字段JsonOutPut里已经是JSON数组了,不需要先把整个表转成JSON再解析,直接解析字段里的内容就行。
修正后的存储过程
下面是修复后的代码,同时做了优化(比如增加视图存在性检查,避免重复执行报错):
CREATE PROC [dbo].[viewJson] AS BEGIN -- 先检查视图是否存在,存在就删除避免报错 IF EXISTS(SELECT * FROM sys.views WHERE name = 'Json1') DROP VIEW Json1; -- 把创建视图的完整逻辑放到动态SQL中,确保上下文统一 EXEC(' CREATE VIEW Json1 AS SELECT FID, Fname, Fcount, FDate, Fregion FROM FoodSara_tbl -- 用CROSS APPLY把JSON数组里的每个对象拆成单独行 CROSS APPLY OPENJSON(JsonOutPut) WITH ( FID INT, Fname NVARCHAR(50), Fcount INT, FDate VARCHAR(400), Fregion NVARCHAR(50) ) AS j ') END
更简单的替代方案(无需存储过程)
如果不需要通过存储过程创建,直接执行下面的语句就能得到你想要的视图:
CREATE VIEW Json1 AS SELECT FID, Fname, Fcount, FDate, Fregion FROM FoodSara_tbl CROSS APPLY OPENJSON(JsonOutPut) WITH ( FID INT, Fname NVARCHAR(50), Fcount INT, FDate VARCHAR(400), Fregion NVARCHAR(50) ) AS j
关键逻辑说明
CROSS APPLY OPENJSON(JsonOutPut):因为你的JsonOutPut字段值是JSON数组(比如[{"FID":1,...}, {...}]),这个语句会把数组里的每个JSON对象拆成单独的数据行。WITH子句:用来指定解析后每个字段的名称和数据类型,和你期望的视图结构完全匹配。
内容的提问来源于stack exchange,提问作者Sara Moradi
相关产品推荐
相关产品推荐

