视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
x如何成功把EXCEL表的数据导入到SQL数据库
2025-09-23 10:29:18 责编:小OO
文档
如何成功把EXCEL表的数据导入到SQL数据库,代码如何编写

insert into tbl008 select id,fld001,fld002,fld003,fld004,fld005,fld006,fld007,fld008 from

OPENROWSET('MICROSOFT.JET.OLEDB.4.0'

,'Excel 5.0;HDR=YES;DATABASE=c:\\123.xls',tbl008$)

 

 

 

 

 

从Excel文件中,导入数据到SQL数据库中,很简单,直接用下面的语句:

--如果接受数据导入的表已经存在

insert into 表 select * from

OPENROWSET('MICROSOFT.JET.OLEDB.4.0'

,'Excel 5.0;HDR=YES;DATABASE=c:test.xls',sheet1$)

--如果导入数据并生成表

select * into 表 from

OPENROWSET('MICROSOFT.JET.OLEDB.4.0'

,'Excel 5.0;HDR=YES;DATABASE=c:test.xls',sheet1$)

--如果从SQL数据库中,导出数据到Excel,如果Excel文件已经存在,而且已经按照要接收的数据创建好表头,就可以简单的用:

insert into OPENROWSET('MICROSOFT.JET.OLEDB.4.0'

,'Excel 5.0;HDR=YES;DATABASE=c:test.xls',sheet1$)

select * from 表

--如果Excel文件不存在,也可以用BCP来导成类Excel的文件,注意大小写:

--导出表的情况

EXEC master..xp_cmdshell 'bcp 数据库名.dbo.表名 out "c:test.xls" /c -/S"服务器名" /U"用户名" -P"密码"'

--导出查询的情况

EXEC master..xp_cmdshell 'bcp "SELECT au_fname, au_lname FROM pubs..authors ORDER BY au_lname" queryout "c:test.xls" /c -/S"服务器名" /U"用户名" -P"密码"'

--上面已经说过,用BCP导出的是类Excel文件,其实质为文本文件,

--要导出真正的Excel文件.就用下面的方法

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_exporttb]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)

drop procedure [dbo].[p_exporttb]

GO

create proc p_exporttb

@tbname sysname,    --要导出的表名

@path nvarchar(1000),   --文件存放目录

@fname nvarchar(250)=''  --文件名,默认为表名

as

declare @err int,@src nvarchar(255),@desc nvarchar(255),@out int

declare @obj int,@constr nvarchar(1000),@sql varchar(8000),@fdlist varchar(8000)

--参数检测

if isnull(@fname,'')='' set @fname=@tbname+'.xls'

--检查文件是否已经存在

if right(@path,1)<>'' set @path=@path+''

create table #tb(a bit,b bit,c bit)

set @sql=@path+@fname

insert into #tb exec master..xp_fileexist @sql

--数据库创建语句

set @sql=@path+@fname

if exists(select 1 from #tb where a=1)

set @constr='DRIVER={Microsoft Excel Driver (*.xls)};DSN='''';READONLY=FALSE'

       +';CREATE_DB="    +';DATABASE='+@sql+'"'

--连接数据库

exec @err=sp_oacreate 'adodb.connection',@obj out

if @err<>0 goto lberr

exec @err=sp_oamethod @obj,'open',null,@constr

if @err<>0 goto lberr

--创建表的SQL

select @sql='',@fdlist=''

select @fdlist=@fdlist+',['+a.name+']'

,@sql=@sql+',['+a.name+'] '

  +case when b.name in('char','nchar','varchar','nvarchar') then

     'text('+cast(case when a.length>255 then 255 else a.length end as varchar)+')'

   when b.name in('tynyint','int','bigint','tinyint') then 'int'

   when b.name in('smalldatetime','datetime') then 'datetime'

   when b.name in('money','smallmoney') then 'money'

   else b.name end

FROM syscolumns a left join systypes b on a.xtype=b.xusertype

where b.name not in('image','text','uniqueidentifier','sql_variant','ntext','varbinary','binary','timestamp')

and object_id(@tbname)=id

select @sql='create table ['+@tbname

+']('+substring(@sql,2,8000)+')'

,@fdlist=substring(@fdlist,2,8000)

exec @err=sp_oamethod @obj,'execute',@out out,@sql

if @err<>0 goto lberr

exec @err=sp_oadestroy @obj

--导入数据

set @sql='openrowset(''MICROSOFT.JET.OLEDB.4.0'',''Excel 5.0;HDR=YES

   ;DATABASE='+@path+@fname+''',['+@tbname+'$])'

exec('insert into '+@sql+'('+@fdlist+') select '+@fdlist+' from '+@tbname)

return

lberr:

exec sp_oageterrorinfo 0,@src out,@desc out

lbexit:

select cast(@err as varbinary(4)) as 错误号

  ,@src as 错误源,@desc as 错误描述

select @sql,@constr,@fdlist

go

--上面是导表的,下面是导查询语句的.

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_exporttb]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)

drop procedure [dbo].[p_exporttb]

GO

create proc p_exporttb

@sqlstr varchar(8000),   --查询语句,如果查询语句中使用了order by ,请加上top 100 percent

@path nvarchar(1000),   --文件存放目录

@fname nvarchar(250),   --文件名

@sheetname varchar(250)=''  --要创建的工作表名,默认为文件名

as

declare @err int,@src nvarchar(255),@desc nvarchar(255),@out int

declare @obj int,@constr nvarchar(1000),@sql varchar(8000),@fdlist varchar(8000)

--参数检测

if isnull(@fname,'')='' set @fname='temp.xls'

if isnull(@sheetname,'')='' set @sheetname=replace(@fname,'.','#')

--检查文件是否已经存在

if right(@path,1)<>'' set @path=@path+''

create table #tb(a bit,b bit,c bit)

set @sql=@path+@fname

insert into #tb exec master..xp_fileexist @sql

--数据库创建语句

set @sql=@path+@fname

if exists(select 1 from #tb where a=1)

set @constr='DRIVER={Microsoft Excel Driver (*.xls)};DSN='''';READONLY=FALSE'

       +';CREATE_DB="    +';DATABASE='+@sql+'"'

--连接数据库

exec @err=sp_oacreate 'adodb.connection',@obj out

if @err<>0 goto lberr

exec @err=sp_oamethod @obj,'open',null,@constr

if @err<>0 goto lberr

--创建表的SQL

declare @tbname sysname

set @tbname='##tmp_'+convert(varchar(38),newid())

set @sql='select * into ['+@tbname+'] from('+@sqlstr+') a'

exec(@sql)

select @sql='',@fdlist=''

select @fdlist=@fdlist+',['+a.name+']'

,@sql=@sql+',['+a.name+'] '

  +case when b.name in('char','nchar','varchar','nvarchar') then

     'text('+cast(case when a.length>255 then 255 else a.length end as varchar)+')'

   when b.name in('tynyint','int','bigint','tinyint') then 'int'

   when b.name in('smalldatetime','datetime') then 'datetime'

   when b.name in('money','smallmoney') then 'money'

   else b.name end

FROM tempdb..syscolumns a left join tempdb..systypes b on a.xtype=b.xusertype

where b.name not in('image','text','uniqueidentifier','sql_variant','ntext','varbinary','binary','timestamp')

and a.id=(select id from tempdb..sysobjects where name=@tbname)

select @sql='create table ['+@sheetname

+']('+substring(@sql,2,8000)+')'

,@fdlist=substring(@fdlist,2,8000)

exec @err=sp_oamethod @obj,'execute',@out out,@sql

if @err<>0 goto lberr

exec @err=sp_oadestroy @obj

--导入数据

set @sql='openrowset(''MICROSOFT.JET.OLEDB.4.0'',''Excel 5.0;HDR=YES

   ;DATABASE='+@path+@fname+''',['+@sheetname+'$])'

exec('insert into '+@sql+'('+@fdlist+') select '+@fdlist+' from ['+@tbname+']')

set @sql='drop table ['+@tbname+']'

exec(@sql)

return

lberr:

exec sp_oageterrorinfo 0,@src out,@desc out

lbexit:

select cast(@err as varbinary(4)) as 错误号

  ,@src as 错误源,@desc as 错误描述

select @sql,@constr,@fdlist

go

 SQL常用语句一览 update   `sdb_mall_goods` set price=price *.44

(1)数据记录筛选:

sql="select*from数据表where字段名=字段值orderby字段名[desc]"

sql="select*from数据表where字段名like'%字段值%'orderby字段名[desc]"

sql="selecttop10*from数据表where字段名orderby字段名[desc]"

sql="select*from数据表where字段名in('值1','值2','值3')"

sql="select*from数据表where字段名between值1and值2"

(2)更新数据记录:

sql="update数据表set字段名=字段值where条件表达式"

sql="update数据表set字段1=值1,字段2=值2……字段n=值nwhere条件表达式"

(3)删除数据记录:

sql="deletefrom数据表where条件表达式"

sql="deletefrom数据表"(将数据表所有记录删除)

(4)添加数据记录:

sql="insertinto数据表(字段1,字段2,字段3…)values(值1,值2,值3…)"

sql="insertinto目标数据表select*from源数据表"(把源数据表的记录添加到目标数据表)

(5)数据记录统计函数:

AVG(字段名)得出一个表格栏平均值

COUNT(*|字段名)对数据行数的统计或对某一栏有值的数据行数统计

MAX(字段名)取得一个表格栏最大的值

MIN(字段名)取得一个表格栏最小的值

SUM(字段名)把数据栏的值相加

引用以上函数的方法:

sql="selectsum(字段名)as别名from数据表where条件表达式"

setrs=conn.excute(sql)

用rs("别名")获取统的计值,其它函数运用同上。

(5)数据表的建立和删除:

CREATETABLE数据表名称(字段1类型1(长度),字段2类型2(长度)……)

例:CREATETABLEtab01 (namevarchar (50), datetimedefaultnow ())

DROPTABLE数据表名称(永久性删除一个数据表)

4.记录集对象的方法:

rs.movenext将记录指针从当前的位置向下移一行

rs.moveprevious将记录指针从当前的位置向上移一行

rs.movefirst将记录指针移到数据表第一行

rs.movelast将记录指针移到数据表最后一行

rs.absoluteposition=N将记录指针移到数据表第N行

rs.absolutepage=N将记录指针移到第N页的第一行

rs.pagesize=N设置每页为N条记录

rs.pagecount根据pagesize的设置返回总页数

rs.recordcount返回记录总数

rs.bof返回记录指针是否超出数据表首端,true表示是,false为否

rs.eof返回记录指针是否超出数据表末端,true表示是,false为否

rs.delete删除当前记录,但记录指针不会向下移动

rs.addnew添加记录到数据表末端

rs.update更新数据表记录

SQL语句的添加、删除、修改虽然有如下很多种方法,但在使用过程中还是不够用,不知是否有高手把更多灵活的使用方法贡献出来?

添加、删除、修改使用db.Execute(Sql)命令执行操作

╔----------------╗

☆ 数据记录筛选 ☆

╚----------------╝

注意:单双引号的用法可能有误(没有测式)

Sql = "Select Distinct 字段名 From 数据表"

Distinct函数,查询数据库存表内不重复的记录

Sql = "Select Count(*) From 数据表 where 字段名1>#18:0:0# and 字段名1< #19:00# "

count函数,查询数库表内有多少条记录,“字段名1”是指同一字段

例:

set rs=conn.execute("select count(id) as idnum from news")

response.write rs("idnum")

sql="select * from 数据表 where 字段名 between 值1 and 值2"

Sql="select * from 数据表 where 字段名 between #2003-8-10# and #2003-8-12#"

在日期类数值为2003-8-10 19:55:08 的字段里查找2003-8-10至2003-8-12的所有记录,而不管是几点几分。

select * from tb_name where datetime between #2003-8-10# and #2003-8-12#

字段里面的数据格式为:2003-8-10 19:55:08,通过sql查出2003-8-10至2003-8-12的所有纪录,而不管是几点几分。

Sql="select * from 数据表 where 字段名=字段值 order by 字段名 [desc]"

Sql="select * from 数据表 where 字段名 like '%字段值%' order by 字段名 [desc]"

模糊查询

Sql="select top 10 * from 数据表 where 字段名 order by 字段名 [desc]"

查找数据库中前10记录

Sql="select top n * form 数据表 order by newid()"

随机取出数据库中的若干条记录的方法

top n,n就是要取出的记录数

Sql="select * from 数据表 where 字段名 in ('值1','值2','值3')"

╔----------------╗

☆ 添加数据记录 ☆

╚----------------╝

sql="insert into 数据表 (字段1,字段2,字段3 …) valuess (值1,值2,值3 …)"

sql="insert into 数据表 valuess (值1,值2,值3 …)"

不指定具体字段名表示将按照数据表中字段的顺序,依次添加

sql="insert into 目标数据表 select * from 源数据表"

把源数据表的记录添加到目标数据表

╔----------------╗

☆ 更新数据记录 ☆

╚----------------╝

Sql="update 数据表 set 字段名=字段值 where 条件表达式"

Sql="update 数据表 set 字段1=值1,字段2=值2 …… 字段n=值n where 条件表达式"

Sql="update 数据表 set 字段1=值1,字段2=值2 …… 字段n=值n "

没有条件则更新整个数据表中的指定字段值

╔----------------╗

☆ 删除数据记录 ☆

╚----------------╝

Sql="delete from 数据表 where 条件表达式"

Sql="delete from 数据表"

没有条件将删除数据表中所有记录)

╔--------------------╗

☆ 数据记录统计函数 ☆

╚--------------------╝

AVG(字段名) 得出一个表格栏平均值

COUNT(*|字段名) 对数据行数的统计或对某一栏有值的数据行数统计

MAX(字段名) 取得一个表格栏最大的值

MIN(字段名) 取得一个表格栏最小的值

SUM(字段名) 把数据栏的值相加

引用以上函数的方法:

sql="select sum(字段名) as 别名 from 数据表 where 条件表达式"

set rs=conn.excute(sql)

用 rs("别名") 获取统的计值,其它函数运用同上。

╔----------------------╗

☆ 数据表的建立和删除 ☆

╚----------------------╝

CREATE TABLE 数据表名称(字段1 类型1(长度),字段2 类型2(长度) …… )

例:CREATE TABLE tab01(name varchar(50),datetime default now())

DROP TABLE 数据表名称 (永久性删除一个数据表)

╔--------------------╗

☆ 记录集对象的方法 ☆

╚--------------------╝

rs.movenext 将记录指针从当前的位置向下移一行

rs.moveprevious 将记录指针从当前的位置向上移一行

rs.movefirst 将记录指针移到数据表第一行

rs.movelast 将记录指针移到数据表最后一行

rs.absoluteposition=N 将记录指针移到数据表第N行

rs.absolutepage=N 将记录指针移到第N页的第一行

rs.pagesize=N 设置每页为N条记录

rs.pagecount 根据 pagesize 的设置返回总页数

rs.recordcount 返回记录总数

rs.bof 返回记录指针是否超出数据表首端,true表示是,false为否

rs.eof 返回记录指针是否超出数据表末端,true表示是,false为否

rs.delete 删除当前记录,但记录指针不会向下移动

rs.addnew 添加记录到数据表末端

rs.update 更新数据表记录下载本文

显示全文
专题