仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 951|回复: 6
打印 上一主题 下一主题

[学习教程] MSSQL网页设计从SQL Server中导进/导出 Excel 的基础...

[复制链接]
海妖 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:39:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
用一个库#bak_database存放这些历史数据。excel|server
从SQLServer中导进/导出Excel的基础办法


/*===================导进/导出Excel的基础办法===================*/

从Excel文件中,导进数据到SQL数据库中,很复杂,间接用上面的语句:

/*===================================================================*/
--假如承受数据导进的表已存在
insertinto表select*from
OPENROWSET(MICROSOFT.JET.OLEDB.4.0
,Excel5.0;HDR=YES;DATABASE=c:test.xls,sheet1$)

--假如导进数据并天生表
select*into表from
OPENROWSET(MICROSOFT.JET.OLEDB.4.0
,Excel5.0;HDR=YES;DATABASE=c:test.xls,sheet1$)


/*===================================================================*/
--假如从SQL数据库中,导出数据到Excel,假如Excel文件已存在,并且已依照要吸收的数据创立好表头,就能够复杂的用:
insertintoOPENROWSET(MICROSOFT.JET.OLEDB.4.0
,Excel5.0;HDR=YES;DATABASE=c:test.xls,sheet1$)
select*from表


--假如Excel文件不存在,也能够用BCP来导成类Excel的文件,注重巨细写:
--导出表的情形
EXECmaster..xp_cmdshellbcp数据库名.dbo.表名out"c:test.xls"/c-/S"服务器名"/U"用户名"-P"暗码"

--导出查询的情形
EXECmaster..xp_cmdshellbcp"SELECTau_fname,au_lnameFROMpubs..authorsORDERBYau_lname"queryout"c:test.xls"/c-/S"服务器名"/U"用户名"-P"暗码"


/*--申明:
c:test.xls为导进/导出的Excel文件名.
sheet1$为Excel文件的事情表名,一样平常要加上$才干一般利用.
--*/
--下面已说过,用BCP导出的是类Excel文件,实在质为文本文件,

--要导出真实的Excel文件.就用上面的办法


/*--数据导出EXCEL

导出表中的数据到Excel,包括字段名,文件为真实的Excel文件
,假如文件不存在,将主动创立文件
,假如表不存在,将主动创立表
基于通用性思索,仅撑持导出尺度数据范例
--邹建2003.10--*/

/*--挪用示例

p_exporttb@tbname=区域材料,@path=c:,@fname=aa.xls
--*/
ifexists(select*fromdbo.sysobjectswhereid=object_id(N[dbo].[p_exporttb])andOBJECTPROPERTY(id,NIsProcedure)=1)
dropprocedure[dbo].[p_exporttb]
GO

createprocp_exporttb
@tbnamesysname,--要导出的表名
@pathnvarchar(1000),--文件寄存目次
@fnamenvarchar(250)=--文件名,默许为表名
as
declare@errint,@srcnvarchar(255),@descnvarchar(255),@outint
declare@objint,@constrnvarchar(1000),@sqlvarchar(8000),@fdlistvarchar(8000)

--参数检测
ifisnull(@fname,)=set@fname=@tbname+.xls

--反省文件是不是已存在
ifright(@path,1)set@path=@path+
createtable#tb(abit,bbit,cbit)
set@sql=@path+@fname
insertinto#tbexecmaster..xp_fileexist@sql

--数据库创立语句
set@sql=@path+@fname
ifexists(select1from#tbwherea=1)
set@constr=DRIVER={MicrosoftExcelDriver(*.xls)};DSN=;READONLY=FALSE
+;CREATE_DB="+;DATABASE=+@sql+"


--毗连数据库
exec@err=sp_oacreateadodb.connection,@objout
if@err0gotolberr

exec@err=sp_oamethod@obj,open,null,@constr
if@err0gotolberr

/*--假如掩盖已存在的表,就加高低面的语句
--创立之前先删除表/假如存在的话
select@sql=droptable[+@tbname+]
exec@err=sp_oamethod@obj,execute,@outout,@sql
--*/

--创立表的SQL
select@sql=,@fdlist=
select@fdlist=@fdlist+,[+a.name+]
,@sql=@sql+,[+a.name+]
+casewhenb.namein(char,nchar,varchar,nvarchar)then
text(+cast(casewhena.length>255then255elsea.lengthendasvarchar)+)
whenb.namein(tynyint,int,bigint,tinyint)thenint
whenb.namein(smalldatetime,datetime)thendatetime
whenb.namein(money,smallmoney)thenmoney
elseb.nameend
FROMsyscolumnsaleftjoinsystypesbona.xtype=b.xusertype
whereb.namenotin(image,text,uniqueidentifier,sql_variant,ntext,varbinary,binary,timestamp)
andobject_id(@tbname)=id
select@sql=createtable[+@tbname
+](+substring(@sql,2,8000)+)
,@fdlist=substring(@fdlist,2,8000)
exec@err=sp_oamethod@obj,execute,@outout,@sql
if@err0gotolberr

exec@err=sp_oadestroy@obj

--导进数据
set@sql=openrowset(MICROSOFT.JET.OLEDB.4.0,Excel5.0;HDR=YES
;DATABASE=+@path+@fname+,[+@tbname+$])

exec(insertinto+@sql+(+@fdlist+)select+@fdlist+from+@tbname)

return

lberr:
execsp_oageterrorinfo0,@srcout,@descout
lbexit:
selectcast(@errasvarbinary(4))as毛病号
,@srcas毛病源,@descas毛病形貌
select@sql,@constr,@fdlist
go
--下面是导表的,上面是导查询语句的.

/*--数据导出EXCEL

导出查询中的数据到Excel,包括字段名,文件为真实的Excel文件
,假如文件不存在,将主动创立文件
,假如表不存在,将主动创立表
基于通用性思索,仅撑持导出尺度数据范例
--邹建2003.10--*/

/*--挪用示例

p_exporttb@sqlstr=select*from区域材料
,@path=c:,@fname=aa.xls,@sheetname=区域材料
--*/
ifexists(select*fromdbo.sysobjectswhereid=object_id(N[dbo].[p_exporttb])andOBJECTPROPERTY(id,NIsProcedure)=1)
dropprocedure[dbo].[p_exporttb]
GO

createprocp_exporttb
@sqlstrvarchar(8000),--查询语句,假如查询语句中利用了orderby,请加上top100percent
@pathnvarchar(1000),--文件寄存目次
@fnamenvarchar(250),--文件名
@sheetnamevarchar(250)=--要创立的事情表名,默许为文件名
as
declare@errint,@srcnvarchar(255),@descnvarchar(255),@outint
declare@objint,@constrnvarchar(1000),@sqlvarchar(8000),@fdlistvarchar(8000)

--参数检测
ifisnull(@fname,)=set@fname=temp.xls
ifisnull(@sheetname,)=set@sheetname=replace(@fname,.,#)

--反省文件是不是已存在
ifright(@path,1)set@path=@path+
createtable#tb(abit,bbit,cbit)
set@sql=@path+@fname
insertinto#tbexecmaster..xp_fileexist@sql

--数据库创立语句
set@sql=@path+@fname
ifexists(select1from#tbwherea=1)
set@constr=DRIVER={MicrosoftExcelDriver(*.xls)};DSN=;READONLY=FALSE
+;CREATE_DB="+;DATABASE=+@sql+"

--毗连数据库
exec@err=sp_oacreateadodb.connection,@objout
if@err0gotolberr

exec@err=sp_oamethod@obj,open,null,@constr
if@err0gotolberr

--创立表的SQL
declare@tbnamesysname
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+]
+casewhenb.namein(char,nchar,varchar,nvarchar)then
text(+cast(casewhena.length>255then255elsea.lengthendasvarchar)+)
whenb.namein(tynyint,int,bigint,tinyint)thenint
whenb.namein(smalldatetime,datetime)thendatetime
whenb.namein(money,smallmoney)thenmoney
elseb.nameend
FROMtempdb..syscolumnsaleftjointempdb..systypesbona.xtype=b.xusertype
whereb.namenotin(image,text,uniqueidentifier,sql_variant,ntext,varbinary,binary,timestamp)
anda.id=(selectidfromtempdb..sysobjectswherename=@tbname)
select@sql=createtable[+@sheetname
+](+substring(@sql,2,8000)+)
,@fdlist=substring(@fdlist,2,8000)

exec@err=sp_oamethod@obj,execute,@outout,@sql
if@err0gotolberr

exec@err=sp_oadestroy@obj

--导进数据
set@sql=openrowset(MICROSOFT.JET.OLEDB.4.0,Excel5.0;HDR=YES
;DATABASE=+@path+@fname+,[+@sheetname+$])

exec(insertinto+@sql+(+@fdlist+)select+@fdlist+from[+@tbname+])

set@sql=droptable[+@tbname+]
exec(@sql)
return

lberr:
execsp_oageterrorinfo0,@srcout,@descout
lbexit:
selectcast(@errasvarbinary(4))as毛病号
,@srcas毛病源,@descas毛病形貌
select@sql,@constr,@fdlist
go


从理论上讲,完全可以为数据表里的每个字段分别建一个索引,但MySQL把同一个数据表里的索引总数限制为16个。
小魔女 该用户已被删除
沙发
发表于 2015-1-19 20:47:09 | 只看该作者
理解了存储结构,再阅读下性能优化的章节基本上会对sqlserver有个清晰地认识
柔情似水 该用户已被删除
板凳
发表于 2015-2-5 14:45:24 | 只看该作者
多加的系统视图和实时系统信息这些东西对DBA挑优非常有帮助,但是感觉粒度还是不太细。
第二个灵魂 该用户已被删除
地板
发表于 2015-2-12 08:20:24 | 只看该作者
学习SQL语言的话如果要学会去做网站就不是很难!但是要做数据库管理的话就有难度了!
分手快乐 该用户已被删除
5#
发表于 2015-3-3 01:24:46 | 只看该作者
入门没那么困难,精通没那么容易
小女巫 该用户已被删除
6#
发表于 2015-3-11 08:16:56 | 只看该作者
如果,某一版本可以提供强大的并发响应,但是没有Oracle的相应版本稳定,或者价格较贵,那么,它就是不适合的。
乐观 该用户已被删除
7#
发表于 2015-3-25 08:19:09 | 只看该作者
对于微软系列的东西除了一遍遍尝试还真没有太好的办法
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-6 03:16

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表