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

导入JSON数据添加加载时间字段遇SQL错误求助

解决JSON导入时新增dateloaded字段的存储过程错误

你现在是想从外部JSON导入数据时,新增dateloaded字段记录数据提取时间,但写的存储过程触发了两个错误,咱们来逐个分析问题所在,再给你修正后的代码:

错误原因拆解

1. 「当子查询未引入EXISTS时,SELECT列表中只能指定一个表达式」

你在VALUES子句里嵌套了一个返回7个字段的子查询(就是解析JSON的OPENJSON语句),但VALUES里的每个位置只能对应单个值,SQL没法把多列的子查询结果直接塞进一个位置里,所以触发了这个错误。

2. 「INSERT语句中的列数多于VALUES子句中指定的值数」

你要插入的目标表有8个列:dateloaded+name/surname等7个业务字段,但你写的VALUES(GETDATE(), (SELECT ...))只提供了两个“元素”——一个是GETDATE(),另一个是子查询的多列结果,和目标列的数量8个完全不匹配,自然就报错了。

修正后的存储过程

正确的做法是用INSERT...SELECT语法,而不是INSERT...VALUES,这样可以直接把GETDATE()作为dateloaded的值,和JSON解析出来的字段一起批量插入:

CREATE PROCEDURE main.loadJSON
AS
BEGIN
    DECLARE @Details NVARCHAR(MAX)
    SELECT @Details = BulkColumn 
    FROM OPENROWSET(BULK 'C:\Users\Vally\Desktop\persondata.json', SINGLE_CLOB) AS JSON

    INSERT INTO main.jsontable (dateloaded, name, surname, email, age, balance, country, registered)
    SELECT 
        GETDATE(),
        [Name],
        [Surname],
        [Email],
        [Age],
        [Balance],
        [Country],
        [Registered]
    FROM OPENJSON(@Details, '$.PersonDetails.Person')
    WITH( 
        [Name] NVARCHAR(50) '$.first_name',
        [Surname] NVARCHAR(50) '$.last_name',
        [Email] NVARCHAR(50) '$.email',
        [Age] NVARCHAR(50) '$.age',
        [Balance] NVARCHAR(50) '$.balance',
        [Country] NVARCHAR(50) '$.country',
        [Registered] NVARCHAR(50) '$.registered'
    )
END
GO

简单说下调整点:

  • 把VALUES换成SELECT,直接将GETDATE()和OPENJSON解析出的每个字段一一对应到目标列
  • 给OPENROWSET加了别名AS JSON(语法更规范)
  • 用BEGIN...END包裹存储过程逻辑,结构更清晰

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:54:45