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循环的错误在哪里?如何修改以实现上述目标?
谢谢。
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循环的错误在哪里?如何修改以实现上述目标?
谢谢。
from opendatasource('MICROSOFT.JET.OLEDB.4.0','Text;HDR=NO;DATABASE=c:\')...[d#txt]
where f1 = 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
我现在搞不定的就是sql下的实现。我想主要问题主要是单引号和双引号的使用不当吧,如何正确的拼接,然后再调用EXECUTE sp_executesql来执行,请高手继续指教。
拼接命令行:
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)但拼接的结果总是抱错,请高手指教。
for /F "delims=" %%i in ('findstr /B /I "^2,.*" d:\test\test.txt ^| find /V /C ""') do (
set nFR_COUNT_M_TO=%%i
)
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命令,以达到获取文件有效行数的目的。
继续求解中
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
*/
-- 最简单的
select 'Row count = '+ltrim(COUNT(1)) from
opendatasource('MICROSOFT.JET.OLEDB.4.0','Text;HDR=NO;DATABASE=c:\')...[test#txt]
where f1=2
-- 首先需要在 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