日期:2014-05-17  浏览次数:20436 次

MS SQL 导入文本文件数据
拿到一批数据,TXT格式的,放在 d:\DATA里面, 文件名为:1上海静安区,2上海长宁区,3上海徐汇区,……,15山东省长清县,16山东省平阴县,……,1123西藏定日县,1124西藏浪卡子县。
每个文件首行是字段名,有下列字段:商品名,商品编号,数量,金额。同一个文件中商品名和商品编号两字段的值都是唯一的,但不同文件中商品名和商品编号是有重复的。
我想将这所有的数据导入MS SQL中MYDATA这个数据库的一个表“汇总表”中,“汇总表”有下面字段:地区编号,地区名称,商品名,商品编号,数量,金额。
不知我描述清楚没。大牛们帮帮忙啊。我只会些很简单的SQL语句,能不能尽量帮我把代码贴出来,先谢谢了。

------解决方案--------------------
这个需求用SSIS做,SSIS有功能可以解析TXT文件,你只需要做一个LOOP,就可以将所有文件一次导入到数据库了,性能不会差。
这个文章的例子很详细,一步一步操作下来就OK了:
http://boyi55.blog.51cto.com/4345/53940
------解决方案--------------------
或者你不懂SSIS可以考虑先将txt的文件名保存下来,然后BULK INSERT循环这些文件插入数据库
------解决方案--------------------
--随便写了一个:
--两个文件:c:\data\1a.txt   c:\data\2b.txt   还有一个schema.ini,即格式配置文件
--1.准备工作:创建临时表,用来存放目录文件编号和名称
CREATE TABLE tttt(a VARCHAR(100))
INSERT tttt  EXEC MASTER.dbo.xp_cmdshell 'dir /b/s c:\data'
GO 
ALTER TABLE tttt ADD code varchar(20),name VARCHAR(20),fullname VARCHAR(20)
GO 
UPDATE tttt SET fullname=PARSENAME(replace(REPLACE(a,'.txt',''),'\','.'),1)
UPDATE tttt SET code=LEFT(fullname,PATINDEX('%[^0-9]%',fullname)-1),NAME=REPLACE(fullname,LEFT(fullname, PATINDEX('%[^0-9]%',fullname)-1),'')
DELETE FROM tttt WHERE a IS NULL OR fullname='ini'

GO 
--创建要导入的目的表,code为编号,name为文件名, a,b,c字段为txt中的字段
CREATE TABLE Res(id INT IDENTITY(1,1),CODE VARCHAR(20),NAME VARCHAR(20),a VARCHAR(10),b VARCHAR(10),c VARCHAR(10))

GO 
--用分布式查询opendatasource和扩展过程实现一次导入:
exec MASTER.DBO.xp_execresultset '
SELECT ''INSERT INTO Res(CODE,NAME,A,B,C) SELECT ''''''+LTRIM(CODE)+'''''',''''''+LTRIM(NAME)+'''''',* FROM OPENDATASOURCE(''''MICROSOFT.JET.OLEDB.4.0'''',''''Text;HDR=yes;Database=c:\data'''')...[''+FULLNAME+''#txt]''
FROM tttt ','test' --这里的test是库的名称

--查询结果
SELECT * FROM res  

--result
/*id          CODE                 NAME                 a          b          c          
----------- -------------------- -------------------- ---------- ---------- ---------- 
1           1                    a                    1          2          3
2           1                    a                    r          6          8
3           1