0

我的组织使用批处理文件对我们的数据库执行查询,我遇到了一种情况,即我需要执行一个太大而无法一次完成的查询。所以我所做的是修改一个批处理文件来循环一个文本文件并单独查询每一行并将结果附加到输出文件中。

问题是当我回显查询变量时,它的读取完全符合预期,但是当我将它传递给 ogr 代替 sql 字符串时,它似乎是空白的。我不确定我是否做错了什么,或者我想要做的事情是不可能的。谁能澄清这里发生了什么?

SET Path=\\my\path\blah\gdal\bin
SET GDAL_DATA=\\my\path\blah\gdal\data

@echo off
SET "file=C:\filepath.txt"
SET /A i=0

REM put file into array line by line
for /F "usebackq delims=" %%a in ("%file%") DO (
set /A i+=1
call set array[%%i%%]=%%a
call set n=%%i%%
)
REM Loop through array entries
for /L %%i in (1,1, %n%) DO (
REM Create SQL String
call set "queryStart="SELECT * FROM _tablename WHERE _fieldname IN ('"
call set uid=%%array[%%i]%%
call set "queryEnd=')""
call set call set "fullQuery=%%queryStart%%%%uid%%%%queryEnd%%"
REM Database Request
ogr2ogr -skipfailures -update -append -s_srs EPSG:4326 -t_srs EPSG:4326 -f "FileGDB" C:\blah\MyExport.gdb PG:"dbname=instagram host=hostservername user=username password=password" -sql %fullquery% -nln "LayerName" -nlt POINT --config FGDB_BULK_LOAD yes
)
pause;
4

1 回答 1

0
SET Path=\\my\path\blah\gdal\bin;%PATH%
SET GDAL_DATA=\\my\path\blah\gdal\data

@echo off
    SET "file=C:\filepath.txt"
    SET /A i=0

    set "queryStart=SELECT * FROM _tablename WHERE _fieldname IN ^('"
    set "queryEnd='^)"

REM put file into array line by line
    for /F "usebackq delims=" %%a in ("%file%") DO (
        ogr2ogr -skipfailures -update -append -s_srs EPSG:4326 -t_srs EPSG:4326 ^
                -f "FileGDB" C:\blah\MyExport.gdb PG:"dbname=instagram host=hostservername user=username password=password" ^
                -sql  "%queryStart%%%a%queryEnd%" ^
                -nln "LayerName" -nlt POINT --config FGDB_BULK_LOAD yes
    )
  • 从路径中删除所有元素不是一个好主意
  • 无需在每次迭代中定义查询的开始和结束
  • 查询中的括号可能有问题,请转义它们
  • 不需要数组,所以直接读取文件,在查询中使用读取的值。
  • 我已拆分行以更好地阅读代码。不知道ogr2ogr会不会抱怨

当然,并不是所有的更改都是需要的,只是为了使其更具可读性。

而且,毕竟,如果我必须打赌,你的问题就在括号里。但我无法测试它。

于 2014-05-07T16:47:02.080 回答