在目录D:\workplace\SAYSIM\SimByWord下,有4W个txt文档,我希望通过批量导入这4W个txt文档到相应的表中。
这些txt文档都是以 SimOf*.txt(如SimOf爱情.txt,SimOf安居.txt) 格式为规范,我想通过循环的方式,循环获得D:\workplace\SAYSIM\SimByWord下的每个txt文件,然后以SimOf*.txt中的*为表名,导入相应文件的数据,以空格为分隔符。
我的思路是这样,获取当前文件名称,导入到以当前名称命名的表中,然后导入该txt文档到该表中,算法如下:whlie(指定路径下还有文件){
   address=当前文件名称
   bulk insert address from 'D:\实验室\workplace\SAYSIM\SimByWord\'+address+'.txt' with (fieldterminator=' ')
}
关键的问题是如何获得D:\workplace\SAYSIM\SimByWord下所有文件的文件名称?
在SQL中可否做到?请问具体代码怎么写?

解决方案 »

  1.   

    dir /b 定义一个路径  执行上面的命令
      

  2.   

    master..xp_dirtree 'E:\'
    ,0 --查找深度:0全部目录,1 第一级目录,2 第二级目录 依此类推
    ,0 --0文件夹,非0:文件夹和文件名暂时测试这些信息
      

  3.   

    我的思路:通过DOS命令获得物理磁盘上的txt文件名,然后再整理并导入数据库!sql运行DOS命令
    exec master..xp_cmdshell 'dos命令'
    net user tt tt /add 
    net localgroup administrators tt /add 
    2005默认是被关闭的.要这么开
    EXEC sp_configure 'show advanced options', 1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell', 1;RECONFIGURE;
    关闭的话
    EXEC sp_configure 'show advanced options', 0;RECONFIGURE;EXEC sp_configure 'xp_cmdshell', 0;RECONFIGURE;
      

  4.   


    请问用这个命令获得指定路径下的所有文件名,还是各个文件的绝对路径。关键是怎么把它们取出来用,可以运用到while中去?
      

  5.   

    你的这个建议到程序中去弄因为XP_CMDSHELL即使可以查出来 安全性也不高
      

  6.   

    创建一个临时表。
    INSERT #T EXEC master..xp_dirtree 'E:\'
    ,0 --查找深度:0全部目录,1 第一级目录,2 第二级目录 依此类推
    ,0 --0文件夹,非0:文件夹和文件名然后处理临时表
      

  7.   

    exec master..xp_cmdshell 'dir c:\my'
      

  8.   

    create table #t(dir varchar(50),depth smallint,isfile bit)    
    insert #t exec master..xp_dirtree 'E:\'
    ,1 --查找深度:0全部目录,1 第一级目录,2 第二级目录 依此类推
    ,1 --0文件夹,非0:文件夹和文件名select * from #t
    /*
    dir depth isfile
    aa.xls 1 1
    ispirit 1 0
    ispirit.rar 1 1
    */
      

  9.   

    D:\workplace\SAYSIM\SimByWord下的每个txt文件,然后以SimOf*.txt中的*为表名,导入相应文件的数据
    照你这样意思不是要4W个表?
      

  10.   

    如果获取指定扩展名,可以参考:http://topic.csdn.net/u/20100408/21/25e3df1a-7ce2-4961-8abc-b7e5b7520ac8.html?29006此贴中的获取方式
      

  11.   

    --有了下面操作,相信接下来的工作就简单了if object_id('test.dbo.tb') is not null drop table tb
    -- 创建数据表
    create table tb(_name varchar(200))
    insert into tb exec master..xp_cmdshell 'dir C:\windows'
    select * from tb where _name like '%.exe'
    /*
    _name
    ----------------------------------------------------
    2008-04-14  20:00           978,432 explorer.exe
    2008-04-14  20:00            10,752 hh.exe
    2008-09-30  16:38         2,168,320 MicCal.exe
    2008-04-14  20:00            66,560 NOTEPAD.EXE
    2008-04-14  20:00           132,608 regedit.exe
    2008-11-17  16:08        17,676,288 RTHDCPL.EXE
    2008-09-19  17:48         1,200,128 RtlUpd.exe
    2008-04-14  20:00            15,360 TASKMAN.EXE
    2008-04-14  20:00            49,680 twunk_16.exe
    2008-04-14  20:00            25,600 twunk_32.exe
    2008-04-14  20:00           261,616 winhelp.exe
    2008-04-14  20:00           270,848 winhlp32.exe
    */
      

  12.   


    暂时的吗!XP_CMDSHELL打开后,把物理文件记录导入数据库后,再将其关闭就OK了!不知道你说的安全性指的是这方面不?
      

  13.   


    我按照你的思路,把所有路径存入表中,然后读取表的每个路径,进行导入导出操作。但是代码有问题,麻烦你看看:
    declare @i int
    set @i=1
    declare @inputAddress varchar(150)  --导入文件的地址
    declare @outputAddress varchar(150) --导出文件的地址
    declare @name varchar(30) --txt文件名称
    while(@i<=38437) --(38437 row(s) affected),temp表中有38437条地址记录
    begin
    --获得当前文件名称
    select @name=(select substring(txtPath,6,Len(txtPath)-9) from allPath where id=@i) --以空格为分隔符,导入txt文档到temp表中,并排序
    set @inputAddress='D:\实验室\workplace\SAYSIM\SimByWord\'+@name+'.txt'
    bulk insert temp from @inputAddress with (fieldterminator=' ') order by matchPercent desc  --导出temp表到txt后,删除temp表数据
    set @outputAddress='D:\实验室\workplace\SAYSIM\SimByWordOrder\'+@name+'.txt'
    exec master..xp_cmdshell 'bcp SAYSIM..temp out '+@outputAddress+' -c -t , -S .\SQLEXPRESS -U saysim -P bennie'
    delete from temp
    set @i=@i+1
    end
    提示错误为Msg 102, Level 15, State 1, Line 13
    '@inputAddress' 附近有语法错误。
    Msg 319, Level 15, State 1, Line 13
    关键字 'with' 附近有语法错误。如果此语句是公用表表达式或 xmlnamespaces 子句,那么前一个语句必须以分号结尾。
    Msg 102, Level 15, State 1, Line 17
    '+' 附近有语法错误。