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

SQL存储过程从单字段JSON表生成视图报错:Incorrect syntax near 'Json1'

解决SQL存储过程创建JSON视图的语法错误问题

咱们先拆解下你遇到的问题:你写的存储过程报错,核心原因有两个——动态SQL的作用域隔离和源表JSON处理逻辑不对。

错误原因解析

  1. 作用域问题:你在动态SQL EXEC('CREATE VIEW Json1 AS SELECT * FROM SM') 里引用的SM,是外层SELECT语句的结果集别名,但动态SQL有自己独立的执行上下文,根本看不到外层的SM,这就导致了语法错误。
  2. 源表处理错误:你的源表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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 03:42:30