Board logo

标题: [讨论]批处理结合sql [打印本页]

作者: coldface     时间: 2010-9-5 02:32    标题: [讨论]批处理结合sql
需求如下: ipmask数据库中保存了一些省份和ip的信息,想通过批处理查询sql,并按照搜索的预定信息输出到特定文件中,ISPID保存了ISP以及对应的ID,ProvinceID包含了省份和对应的ID。 ISPID文件内容: DIANXIN 2 TIETONG 3 ProvinceID.txt文件内容: anhui 1 beijing 2 我想实现比如说执行一次对安徽电信的查询(即SELECT where isp=2 and province=1),把结果输出到以anhui_dianxin命名文件下。注意文件中拼音与数字的对应关系。每执行一次就把结果输出到对应的命名文件下 如下是我写的一个查询,但是查询下来不是按照预想的输出的,那个select语句在for中执行写入到文件的内容都一样,如何解决这个问题? 谢谢! @echo off&setlocal ENABLEDELAYEDEXPANSION for /f "tokens=1 delims= " %%j in (ISPID.txt) do ( for /f "tokens=1 delims= " %%k in (ProvinceID.txt) do ( echo.>acl_%%j_%%k_1.txt for /f "tokens=2 delims= " %%a in (ISPID.txt) do ( for /f "tokens=2 delims= " %%b in (ProvinceID.txt) do ( sqlcmd -U XX -P XX -d ipmask -Q "SELECT [net],[net mask] FROM [ipmask].[dbo].[result] where isp=%%a and province=%%b" -o acl_%%j_%%k_1.txt ) ) ) )

作者: lxmxn     时间: 2010-9-5 14:41
可以写个函数来获取ID对应的ISP或者省份。
D:\clark>type get_ISP.bat @echo off for /f "tokens=1,2" %%i in (ISPID.TXT) do ( if /i "%%j" == "%~1" echo %%i ) D:\clark>type ISPID.txt DIANXIN 2 TIETONG 3 D:\clark>get_ISP.bat 3 TIETONG

作者: coldface     时间: 2010-9-5 14:59
哦?呵呵 谢谢,我去试试。 还可以这样的呀,呵呵

作者: coldface     时间: 2010-9-5 15:08
其实主要的疑点是查询上,怎么对应查询,比如读取ISPID 1,然后select 其它的省ID,然后写入到文件,版主你发的那个可以解决对应文件的写入,但是对查询那块不能实现啊。主要是for嵌套的问题

作者: lxmxn     时间: 2010-9-5 15:34
从你写的脚本内容来看,大体可以知道,你有两点没弄明白 1、“setlocal ENABLEDELAYEDEXPANSION”,在什么情况下才需要用?本例中并不需要这个。 2、for中的变量可以迭代,若指定第一个变量为%%a,那么可以在for后续的循环体中用%%b代表第二个变量,%%c代表第三个,依此类推。 建议把for循环的帖子好好看看,弄懂为止 可能你完全弄懂需要花费3个小时的时间,但总比你求助一次要花半小时,以后遇到10次for循环的问题要好,因为弄懂之后,不会为再次出现相同的问题而浪费时间。
@echo off
for /f "tokens=1,2" %%a in (ISPID.TXT) do (
  for /f "tokens=1,2" %%c in (ProvinceID.txt) do (
    echo.> acl_%%a_%%c_1.txt
    sqlcmd  -U XX -P XX -d ipmask -Q "SELECT [net],[net mask] FROM [ipmask].[dbo].[result] where isp=%%b and province=%%d" -o acl_%%a_%%c_1.txt
  )
)
pause

作者: coldface     时间: 2010-9-5 18:17
对对,谢谢。我那会想出来了,这个%%b就是类似于C语言下的a++。 谢谢!