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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 14:06:22