INSERT INTO迁移数据解析JSON数组为多列时报字段数量不匹配如何解决
问题解决方法
报错核心原因
- 你的SELECT语句存在语法疏漏:
[network_id]后缺少逗号,会被数据库解析为[network_id] AS [network_name],直接导致返回结果少1列,触发列数不匹配报错。 - INSERT语句未显式指定插入列列表:如果直接使用
INSERT INTO 目标表 SELECT ...的省略列写法,数据库会要求SELECT返回的列数量、顺序和目标表的全部字段完全对齐。你将单个focusJSON列拆分为两个独立字段后,SELECT返回的列结构和目标表默认字段顺序/数量不匹配,也会触发该报错。
正确写法示例
你需要先修正SELECT的语法错误,同时在INSERT语句中显式列出所有要插入的目标列,确保和SELECT返回的列一一对应:
INSERT INTO 你的目标表完整名称 ( network_id, network_name, network_type, service_type_ids, military_focus, health_insurance_focus, created_at, updated_at, LoadDt, FileNM ) SELECT [network_id], [network_name], [network_type], [service_type_ids], JSON_VALUE(focus,'$.military_focus') AS military_focus, JSON_VALUE(focus,'$.health_insurance_focus') AS health_insurance_focus, [created_at], [updated_at], [LoadDt], [FileNM] FROM [Med_Stage].[Provider].[networks]
额外注意事项
如果目标表的military_focus和health_insurance_focus字段是布尔类型,你可以将JSON_VALUE的返回值显式转换为布尔类型,避免隐式类型转换异常:
- SQL Server 环境可以写成:
CAST(JSON_VALUE(focus,'$.military_focus') AS BIT) AS military_focus - MySQL 环境可以写成:
CAST(JSON_UNQUOTE(JSON_EXTRACT(focus,'$.military_focus')) AS BOOLEAN) AS military_focus
内容的提问来源于stack exchange,提问作者Don
相关产品推荐
相关产品推荐

