导入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
相关产品推荐
相关产品推荐

