在目录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中可否做到?请问具体代码怎么写?
这些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中可否做到?请问具体代码怎么写?
,0 --查找深度:0全部目录,1 第一级目录,2 第二级目录 依此类推
,0 --0文件夹,非0:文件夹和文件名暂时测试这些信息
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;
请问用这个命令获得指定路径下的所有文件名,还是各个文件的绝对路径。关键是怎么把它们取出来用,可以运用到while中去?
INSERT #T EXEC master..xp_dirtree 'E:\'
,0 --查找深度:0全部目录,1 第一级目录,2 第二级目录 依此类推
,0 --0文件夹,非0:文件夹和文件名然后处理临时表
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
*/
照你这样意思不是要4W个表?
-- 创建数据表
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
*/
暂时的吗!XP_CMDSHELL打开后,把物理文件记录导入数据库后,再将其关闭就OK了!不知道你说的安全性指的是这方面不?
我按照你的思路,把所有路径存入表中,然后读取表的每个路径,进行导入导出操作。但是代码有问题,麻烦你看看:
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
'+' 附近有语法错误。