导航
  • 主页
  • 基础类
  • 应用实例
  • 新技术前沿

关于导入外部的数据的存储过程或其它方法

jycnet 2007-12-04 01:35:40
请教各位朋友:

我有一个MDB数据文件(ACCESS的),其中表A的数据格式如下
name, stime, sdate ,scode
aaa, 08:20, 2007-10-10, 进入
aaa, 09:05, 2007-10-10, 外出
aaa, 10:10, 2007-10-10, 进入
aaa, 16:12, 2007-10-10, 外出
bbb, 08:22, 2007-10-10, 进入
bbb, 10:25, 2007-10-10, 外出
bbb, 12:21, 2007-10-10, 进入
bbb, 17:14, 2007-10-10, 外出

aaa, 08:21, 2007-10-11, 进入
aaa, 09:05, 2007-10-11, 外出
aaa, 10:10, 2007-10-11, 进入
aaa, 15:12, 2007-10-11, 外出
bbb, 08:25, 2007-10-11, 进入
bbb, 10:25, 2007-10-11, 外出
bbb, 12:21, 2007-10-11, 进入
bbb, 16:11, 2007-10-11, 外出


我在SQL里想写一个储存过程,把表A的内容导进来产生一个新表,并作些处理:

1.每次只导入新的数据,以前导入过的数据不能动。
2.导入时能不能将数据变成下面的格式:

name, sdate ,time1_min,time1_max
aaa, 2007-10-10,08:20,16:12
bbb, 2007-10-10,08:22,17:14
aaa, 2007-10-11,08:21,15:12
bbb, 2007-10-11,08:25,16:11

3.因为MDB文件特别大(600多MB),表A的数据有几十万条,有没有什么好方法(我想的是写储存过程)

使导入的速度快一些?


多谢各位!
...全文
147 点赞 收藏 15
写回复
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
jycnet 2007-12-06
先谢谢charry0110,issacp

我按照两位的提示写了一个:

set ANSI_NULLS on
go
set ANSI_WARNINGS on
go

CREATE PROCEDURE AAA AS
create table #tmp(Name char(10),Sdate char(10),stime char(8),scode char(10))
insert into #tmp
SELECT * FROM OPENROWSET('microsoft.jet.oledb.4.0', ';database=D:\A.mdb', 'select name,sdate,stime,scode from A') tmp
SELECT a.name, a.sdate,
ISNULL
((SELECT MIN(stime)
FROM dbo.#tmp
WHERE name=a.name and sdate=a.sdate and scode= '进入'), NULL) AS jtime,
ISNULL
((SELECT MAX(stime)
FROM dbo.#tmp
WHERE name=a.name and sdate=a.sdate and scode = '外出'), NULL) AS wtime

from dbo.#tmp a
GO

上面的是一次性导入全部记录。还有速度是问题,要10分钟
因为A.mdb是每天增长的,还不能只导入不同的记录,大家看看有什么好办法?
回复
jycnet 2007-12-05
楼上的你没有看清我的问题。
回复
issacp 2007-12-05
LZ根据的问题要求:
1.每次只导入新的数据,以前导入过的数据不能动。
=================================
--建议你用DTS或BCP导入数据,相关用法楼上已经给出

2.导入时能不能将数据变成下面的格式:

name, sdate ,time1_min,time1_max
aaa, 2007-10-10,08:20,16:12
bbb, 2007-10-10,08:22,17:14
aaa, 2007-10-11,08:21,15:12
bbb, 2007-10-11,08:25,16:11
===============================
create table t ([name] varchar(10),stime varchar(10),sdate varchar(10),scode varchar(10))
go

insert into t values ('aaa','08:20','2007-10-10','进入')
insert into t values ('aaa','09:05','2007-10-10','外出')
insert into t values ('aaa','10:10','2007-10-10','进入')
insert into t values ('aaa','16:12','2007-10-10','外出')
insert into t values ('bbb','08:22','2007-10-10','进入')
insert into t values ('bbb','10:25','2007-10-10','外出')
insert into t values ('bbb','12:21','2007-10-10','进入')
insert into t values ('bbb','17:14','2007-10-10','外出')
insert into t values ('aaa','08:21','2007-10-11','进入')
insert into t values ('aaa','09:05','2007-10-11','外出')
insert into t values ('aaa','10:10','2007-10-11','进入')
insert into t values ('aaa','15:12','2007-10-11','外出')
insert into t values ('bbb','08:25','2007-10-11','进入')
insert into t values ('bbb','10:25','2007-10-11','外出')
insert into t values ('bbb','12:21','2007-10-11','进入')
insert into t values ('bbb','16:11','2007-10-11','外出')
go

select [name],sdate,min(stime) as time1_min,max(stime)as time1_max from t group by [name],sdate

drop table t
3.因为MDB文件特别大(600多MB),表A的数据有几十万条,有没有什么好方法(我想的是写储存过程)
--....
回复
jycnet 2007-12-05
大家帮忙给看看
回复
issacp 2007-12-05
2.导入时能不能将数据变成下面的格式:

name, sdate ,time1_min,time1_max
aaa, 2007-10-10,08:20,16:12
bbb, 2007-10-10,08:22,17:14
aaa, 2007-10-11,08:21,15:12
bbb, 2007-10-11,08:25,16:11
===============================
create table t ([name] varchar(10),stime varchar(10),sdate varchar(10),scode varchar(10))
go

insert into t values ('aaa','08:20','2007-10-10','进入')
insert into t values ('aaa','09:05','2007-10-10','外出')
insert into t values ('aaa','10:10','2007-10-10','进入')
insert into t values ('aaa','16:12','2007-10-10','外出')
insert into t values ('bbb','08:22','2007-10-10','进入')
insert into t values ('bbb','10:25','2007-10-10','外出')
insert into t values ('bbb','12:21','2007-10-10','进入')
insert into t values ('bbb','17:14','2007-10-10','外出')
insert into t values ('aaa','08:21','2007-10-11','进入')
insert into t values ('aaa','09:05','2007-10-11','外出')
insert into t values ('aaa','10:10','2007-10-11','进入')
insert into t values ('aaa','15:12','2007-10-11','外出')
insert into t values ('bbb','08:25','2007-10-11','进入')
insert into t values ('bbb','10:25','2007-10-11','外出')
insert into t values ('bbb','12:21','2007-10-11','进入')
insert into t values ('bbb','16:11','2007-10-11','外出')
go

insert into oldt ([name],stime,sdate,scode) select [name],sdate,min(stime) as time1_min,max(stime)as time1_max from t where 标记=0 group by [name],sdate---加一个标记条件符合的就插入表即可

drop table t
回复
issacp 2007-12-05
--Sorry
1.每次只导入新的数据,以前导入过的数据不能动。
=================================
--给你个思路:只导入新的数据,以前导入过的数据不能动,那么有两个方法供参考,
[1]添加一个字段做标记,用于标记是否做过导入
[2]通过中间表将旧数据与有新数据的表做比较
回复
jycnet 2007-12-04
大家给看看
回复
jycnet 2007-12-04
select Name,sdate,right(min(stime),6) as time1_min,right(max(stime),6) as time1_max
from tr group by Name,sdate


先谢谢charry0110 ,我想列出所有人的每一天的进入的最早时间和外出的最晚时间,因为考勤用,所以上面查询语句恐怕不行

,另外把所有你写的写成存储过程该怎么写
回复
晓风残月0110 2007-12-04

2.导入时能不能将数据变成下面的格式:

select Name,sdate,right(min(stime),6) as time1_min,right(max(stime),6) as time1_max
from tr group by Name,sdate

回复
晓风残月0110 2007-12-04
1.每次只导入新的数据,以前导入过的数据不能动。

--
SELECT * FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0','路径';'用户名';'密码','SELECT * FROM 你的表') where sdate= (select max(sdate) FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0','路径';'用户名';'密码','SELECT * FROM 你的表'))
--
select * form newtable
where sdate = (select max(sdate) from sdate)
回复
jycnet 2007-12-04
这是光导入的,后面如何处理了?
回复
晓风残月0110 2007-12-04
表A的内容导进来产生一个新表

--*Access
--1
SELECT * into newtable FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0','D:\db.mdb';'admin';'','SELECT * FROM vote')
SELECT * FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0','路径';'用户名';'密码','SELECT * FROM 你的表')
--2
select * into newtable from OPENDATASOURCE('Microsoft.Jet.OLEDB.4.0',
'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\db.mdb;Persist Security Info=False')...vote

回复
jycnet 2007-12-04
请朋友写的详细些,我比较菜
回复
-狙击手- 2007-12-04
openrowset
回复
kk19840210 2007-12-04
用DTS 导入

在DTS里写根据语句导入
回复
发动态
发帖子
MS-SQL Server
创建于2007-09-28

3.2w+

社区成员

MS-SQL Server相关内容讨论专区
申请成为版主
社区公告
暂无公告