1、sql语句如下:
DECLARE 
  @vcDirName VARCHAR(100)
  ,@vcFName  VARCHAR(100)
  ,@nFR_COUNT_M_TO INT  SET @vcDirName     ='D:\TEST'  --FOLDER
  SET @vcFName       ='TEST.TXT' --FILE NAME
  SET @nFR_COUNT_M_TO=0          --ROW COUNT WITH '2' AHEAD  for /F "delims=" %i in ('findstr /B /I "^2,.*" @vcDirName\@vcFName ^| find /V /C ""') do set @nFR_COUNT_M_TO=%i   PRINT 'ROW COUNT= ' + CAST(@nFR_COUNT_M_TO AS VARCHAR)
2、目标:获取test.txt文件中以2开头的数据的行数。
3、文件格式如下示例:
1,1,1,1,1
2,1,1,1,1
2,3,3,3,4
3,2,2,2,2
4,5,2,2,2
2,1,4,5,2以上示例数据中,以2开头的数据有3行,故@nFR_COUNT_M_TO应该返回3。
4、问题:
我的sql语句的for循环的错误在哪里?如何修改以实现上述目标?
谢谢。

解决方案 »

  1.   

    select * 
    from opendatasource('MICROSOFT.JET.OLEDB.4.0','Text;HDR=NO;DATABASE=c:\')...[d#txt]
    where f1 = 2
      

  2.   


    -- 逗号是默认的分隔符号,f1 也是默认的第一列,其他的列为 f2、f3、f4 ...
    -- 如果使用其他的分隔符或者列名,可以在 schema.inf 文件中定义
    select COUNT(1) from opendatasource('MICROSOFT.JET.OLEDB.4.0','Text;HDR=NO;DATABASE=c:\')...[test#txt] where f1=2
    [code=BatchFile]
    ::批处理
    @echo offsetlocal EnableDelayedExpansion
    set _i=0
    for /f "delims=," %%A in (c:\test.txt) do (
     if %%A==2  set /a _i=!_i!+1
    )
    echo !_i!
    endlocal
    [/code]
    # PowerShell 脚本
    $count = 0
    foreach ($line in (get-content c:\test.txt))
    {
        if ($line -match "^2")
        {$count += 1}
    }Write-Host $count
      

  3.   

    bat版本的实现,我已经知道了,还是要感谢的。
    我现在搞不定的就是sql下的实现。我想主要问题主要是单引号和双引号的使用不当吧,如何正确的拼接,然后再调用EXECUTE sp_executesql来执行,请高手继续指教。
      

  4.   

    增加变量,@strCMD nvarchar(4000)
    拼接命令行:
    SET @strCMD = 
      'for /F ' + '''''' + 'delims=' +'''''' +
      ' %%i in (' + 'findstr /B /I ' + '''''' + '^2,.* ' +''''' ' +  @vcDirName + '\' + @vcFName + ' ^| find /V /C ' +'''''''''' +' do (' +
      ' set ' + '''' + CAST(@nFR_COUNT_M_TO AS VARCHAR) + '''' + '=%%i' +
      ')'
      print @strCMD
      EXECUTE sp_executesql @strCMD,N'@nFR_COUNT_M_TO bigint OUTPUT',@nFR_COUNT_M_TO OUTPUT
      PRINT 'ROW COUNT= ' + CAST(@nFR_COUNT_M_TO AS VARCHAR)但拼接的结果总是抱错,请高手指教。
      

  5.   

    bat下正确执行的语句如下供参考:
    for /F "delims=" %%i in ('findstr /B /I "^2,.*" d:\test\test.txt ^| find /V /C ""') do (
    set nFR_COUNT_M_TO=%%i
    )
      

  6.   

    补充说明:
    bat下正确执行的语句如下供参考: 
    for /F "delims=" %%i in ('findstr /B /I "^2,.*" d:\test\test.txt ^| find /V /C ""') do ( 
    set nFR_COUNT_M_TO=%%i 
    )然后如何通过
    EXECUTE master..xp_cmdshell @strCMD
    或者EXECUTE sp_executesql 
    来执行该bat命令,以达到获取文件有效行数的目的。
    继续求解中
      

  7.   


    declare @vcDirName varchar(100);
    set @vcDirName='c:\';
    declare @vcFName varchar(100);
    set @vcFName='test.txt';declare @cmd varchar(400);
    set @cmd='findstr /B /I "^2.*" '+ @vcDirName + @vcFName+' | find /C /V ""';--print @cmd
    declare @output table ([output] varchar(10));
    insert into @output
    exec master.dbo.xp_cmdshell @cmd;select top(1) 'Row Counts = '+[output] from @output/*
    Row Counts = 3
    */
      

  8.   


    -- 最简单的
    select 'Row count = '+ltrim(COUNT(1)) from 
    opendatasource('MICROSOFT.JET.OLEDB.4.0','Text;HDR=NO;DATABASE=c:\')...[test#txt] 
    where f1=2
      

  9.   

    能不能给解释一下,'MICROSOFT.JET.OLEDB.4.0','Text;HDR=NO;DATABASE=c:\')...[test#txt]得含义?我怎么调不通。
      

  10.   


    -- 首先需要在 SQL Server 上打开“分布查询”
    sp_configure 'show advanced options', 1;
    GO
    RECONFIGURE;
    GO
    sp_configure 'Ad Hoc Distributed Queries', 1;
    GO
    RECONFIGURE;
    GO-- 然后使用 opendatasource 通过 MICROSOFT.JET.OLEDB.4.0 提供程序读取 txt 文件
    -- 其中 Text 指定数据源为文本文件,DATABASE 指定文件所在的路径,HDR=NO 指定文件的第一行为数据,而非列名
    -- [test#txt] 为表名,其对应 test.txt 文件(. 用 # 代替)
    -- 由于 SQL Server 使用四部分名,因此 opendatasource 与 [test#txt] 间有 ... 对应省略的 .dbname.schema.
    select 'Row count = '+ltrim(COUNT(1)) from 
    opendatasource('MICROSOFT.JET.OLEDB.4.0','Text;HDR=NO;DATABASE=c:\')...[test#txt] 
    where f1=2