ogr2ogr批量合并GeoPackage导入MSSQL Spatial无数据问题排查
问题根因
脚本执行后仅生成空表无数据,由两个直接错误导致:
- 首次导入
File1.gpkg时同时使用了-update和-append参数:目标表不存在时,两个参数组合会触发ogr2ogr的逻辑冲突,仅创建空表结构,不会执行实际数据写入。 - 循环内
-gt 100000参数设置严重超出MSSQL能力上限:-gt控制单次批量写入的要素数量,MSSQL单语句支持的参数上限为2100,设置为10万会直接触发写入失败,批处理默认未开启错误输出时,不会弹出报错,表现为无数据写入。
修复后可直接运行的批处理脚本
@echo off setlocal enabledelayedexpansion :: 基础配置 set "MSSQLSPATIAL_USE_GEOMETRY_COLUMNS=NO" :: 开启MSSQL批量拷贝模式,导入速度提升5-10倍 set "MSSQLSPATIAL_BCP=YES" set "DB_CONN=MSSQL:server=x;database=y;trusted_connection=yes" set "TARGET_TABLE=SQLTableName" set "SRS=EPSG:27700" :: 单次批量写入要素数,不超过2000即可,避免触发MSSQL单批参数上限 set "BATCH_SIZE=1000" echo 正在执行首次导入,创建表结构并写入首个文件数据... :: 首次导入不要加-update -append,目标表不存在时直接完成建表+写入 ogr2ogr -f "MSSQLSpatial" "%DB_CONN%" "File1.gpkg" -nln "%TARGET_TABLE%" -gt %BATCH_SIZE% -t_srs "%SRS%" -s_srs "%SRS%" -progress if %errorlevel% neq 0 ( echo 首次导入失败,错误码:%errorlevel% pause exit /b %errorlevel% ) echo 开始批量导入目录下其余GPKG文件... for %%a in ("Folder\*.gpkg") do ( :: 跳过已经导入过的File1.gpkg,避免重复写入 if /i "%%~nxa" neq "File1.gpkg" ( echo 正在导入:%%a ogr2ogr -f "MSSQLSpatial" "%DB_CONN%" "%%a" -update -append -nln "%TARGET_TABLE%" -gt %BATCH_SIZE% -t_srs "%SRS%" -s_srs "%SRS%" -progress if !errorlevel! neq 0 ( echo 文件%%a导入失败,错误码:!errorlevel! pause exit /b !errorlevel! ) ) ) echo 所有文件导入完成 pause
优化&避坑提示
- 运行脚本前先删除之前生成的空表,避免表已存在导致首次导入逻辑异常
- 如果存放GPKG的
Folder目录已经包含File1.gpkg,可以直接删掉单独的首次导入代码段,移除循环内的文件名判断即可:第一次遍历到文件时如果目标表不存在,ogr2ogr会自动完成建表+写入,不需要单独拆分第一个文件 - 导入前建议把目标SQL Server数据库的恢复模式调整为「简单」,给事务日志分配足够的初始空间,避免大文件导入时日志文件暴涨占满磁盘
- 如果遇到字段长度截断、字段名不统一的报错,可以在ogr2ogr命令里追加
-lco "GEOMETRY_NAME=geom" -lco "FID=id" -unsetFieldWidth参数,统一几何字段、主键ID字段名,同时自动适配字段长度,避免沿用GPKG内默认的短字段长度配置导致写入失败
内容的提问来源于stack exchange,提问作者NiallMcS
相关产品推荐
相关产品推荐

