如何使用SSIS导入JSON格式文本文件数据并加载到SQL Server
SSIS 脚本组件实现JSON文本文件导入SQL Server操作指南
前置准备
- 提前在SQL Server中创建目标表,列名与JSON键完全对应,数据类型按需配置:字符串类字段用
nvarchar,经纬度用decimal,时间用datetime即可 - 在SSIS包中添加「平面文件源」,配置为读取你的JSON文本文件,设置每行读取一条完整JSON,输出列命名为
JsonContent - 新增「脚本组件」(类型选择「转换」),将平面文件源的输出连接到该组件
- 打开脚本组件编辑器:
- 「输入列」页勾选
JsonContent列 - 「输入和输出」页添加输出列,与JSON的键一一对应,配置匹配的数据类型
- 选择脚本语言为C#,点击「编辑脚本」进入代码编辑界面
- 「输入列」页勾选
核心代码示例
这里提供两种常用的JSON解析方案,按需选择即可:
方案1:使用内置System.Text.Json解析(无需额外部署第三方库)
在脚本代码中先添加命名空间引用:
using System.Text.Json;
找到Input0_ProcessInputRow方法,替换为以下内容:
public override void Input0_ProcessInputRow(Input0Buffer Row) { try { // 解析当前行的JSON字符串 JsonElement jsonObj = JsonSerializer.Deserialize<JsonElement>(Row.JsonContent); // 逐字段赋值到输出列 Row.apeId = jsonObj.GetProperty("apeId").GetString(); Row.apeName = jsonObj.GetProperty("apeName").GetString(); Row.id = jsonObj.GetProperty("id").GetString(); Row.imageUrl = jsonObj.GetProperty("imageUrl").GetString(); Row.lat = Convert.ToDecimal(jsonObj.GetProperty("lat").GetString()); Row.lng = Convert.ToDecimal(jsonObj.GetProperty("lng").GetString()); Row.monitorTask = jsonObj.GetProperty("monitorTask").GetString(); Row.resultTime = Convert.ToDateTime(jsonObj.GetProperty("resultTime").GetString()); Row.sceneImgUrl = jsonObj.GetProperty("sceneImgUrl").GetString(); Row.subType = jsonObj.GetProperty("subType").GetString(); Row.subjectId = jsonObj.GetProperty("subjectId").GetString(); Row.trackId = jsonObj.GetProperty("trackId").GetString(); } catch { // 解析错误的行重定向到错误输出,避免包整体失败 Row.DirectRowToErrorOutput(); } }
如果存在字段可能缺失的场景,可以用TryGetProperty判断后再取值,避免抛出异常:
if (jsonObj.TryGetProperty("sceneImgUrl", out JsonElement sceneImgProp)) { Row.sceneImgUrl = sceneImgProp.GetString(); } else { Row.sceneImgUrl_IsNull = true; }
方案2:使用Newtonsoft.Json解析
需要提前将Newtonsoft.Json.dll安装到服务器的GAC中,再添加引用到脚本项目,命名空间引用:
using Newtonsoft.Json.Linq;
核心解析逻辑:
public override void Input0_ProcessInputRow(Input0Buffer Row) { try { JObject jsonObj = JObject.Parse(Row.JsonContent); Row.apeId = jsonObj["apeId"].ToString(); Row.apeName = jsonObj["apeName"].ToString(); // 剩余字段赋值逻辑和上面一致,按需做类型转换即可 } catch { Row.DirectRowToErrorOutput(); } }
后续配置
脚本编辑完成后保存关闭,添加「OLE DB目标」连接到脚本组件的输出,配置输出列和SQL目标表的字段映射,运行包即可完成数据导入。
内容的提问来源于stack exchange,提问作者Isteyak Ahmad
相关产品推荐
相关产品推荐

