首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

MS SQL 导入文本文件数据,该如何解决

2013-04-02 
MS SQL 导入文本文件数据拿到一批数据,TXT格式的,放在 d:\DATA里面, 文件名为:1上海静安区,2上海长宁区,3

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                    a                    y          9          10


4           2                    b                    66         2          3
5           2                    b                    oo         6          8
6           2                    b                    y          9          10

(所影响的行数为 6 行)

*/


[解决办法]
还没搞定?
我帮你再写一个存储过程
CREATE  PROC P_ImportTxt 
@Path VARCHAR(100) --TXT文件路径,格式如C:\data

AS
SET NOCOUNT ON 

DECLARE @SqlT VARCHAR(1000)
DECLARE @Code VARCHAR(20),@FullName VARCHAR(50)

IF OBJECT_ID('T','U') IS NOT NULL EXEC('DROP TABLE T')
IF OBJECT_ID('Res','U') IS NOT NULL EXEC('DROP TABLE Res')

SET @SqlT='CREATE TABLE T(a VARCHAR(100))'
EXEC(@SqlT)

SET @SqlT='INSERT T  EXEC MASTER.dbo.xp_cmdshell ''dir /b/s '+@Path+''''
EXEC(@SqlT)

SET @SqlT='ALTER TABLE T ADD Code VARCHAR(20),NAME VARCHAR(20),FULLNAME VARCHAR(50)'
EXEC(@SqlT)

SET @SqlT='UPDATE T SET FULLNAME=PARSENAME(REPLACE(REPLACE(a,''.txt'',''''),''\'',''.''),1)'
EXEC(@SqlT)

SET @SqlT='UPDATE T SET CODE=LEFT(FULLNAME,PATINDEX(''%[^0-9]%'',FULLNAME)-1),NAME=REPLACE(FULLNAME,LEFT(FULLNAME, PATINDEX(''%[^0-9]%'',FULLNAME)-1),'''')'
EXEC(@SqlT)
SET @SqlT='DELETE FROM T WHERE a IS NULL OR NAME=''ini'''
EXEC(@SqlT)
 
--创建要导入的目的表,code为编号,name为文件名, a,b,c字段为txt中的字段
SET @SqlT='CREATE TABLE Res(Id INT IDENTITY(1,1),CODE VARCHAR(20),NAME VARCHAR(20),a VARCHAR(10),b VARCHAR(10),c VARCHAR(10))'
EXEC(@SqlT)
 
EXEC ('DECLARE CurT CURSOR FOR
SELECT Code,FullName FROM T ORDER BY Code')
OPEN CurT 
FETCH NEXT FROM CurT INTO @Code,@FullName

WHILE @@FETCH_STATUS=0
BEGIN
SET @SqlT='INSERT INTO Res(CODE,NAME,A,B,C) SELECT '''+LTRIM(@Code)+''','''+@FullName+''',* FROM OPENDATASOURCE(''MICROSOFT.JET.OLEDB.4.0'',''Text;HDR=yes;Database='+@Path+''')...['+@FullName+'#txt]'
EXEC(@SqlT)

FETCH NEXT FROM curT INTO @code,@fullname
END
CLOSE CurT
DEALLOCATE CurT

--End
--调用
EXEC P_ImportTxt 'C:\data'

SELECT * FROM res
  

热点排行