仓酷云

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

[学习教程] MSSQL教程之导进/导出dBase

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

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

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

x
在执行崩溃恢复时,理解在一个数据库中的每一个表tbl_name对应的在数据库目录中的3个文件是很重要的:
从dBase文件中,导进数据到SQL数据库中,很复杂,间接用上面的语句:

/*===================================================================*/
--假如承受数据导进的表已存在
insertinto表select*from
openrowset(MICROSOFT.JET.OLEDB.4.0
,dBase5.0;DATABASE=c:,select*from[test.dbf])

--假如导进数据并天生表
select*into表from
openrowset(MICROSOFT.JET.OLEDB.4.0
,dBase5.0;DATABASE=c:,select*from[test.dbf])


/*===================================================================*/
--假如从SQL数据库中,导出数据到dBase,假如dBase文件已存在,就能够复杂的用:
insertinto
openrowset(MICROSOFT.JET.OLEDB.4.0
,dBase5.0;DATABASE=c:,select*from[test.dbf])
select*from表


/*--申明:
DATABASE=c:c:是dbf文件的寄存目次
select*from[test.dbf]test.dbf是指dbf文件名
--*/



--假如dBase文件不存在,就必要用到上面的存储历程了.



/*--数据导出dBase

导出表中的数据到dBase,假如文件不存在,将主动创立文件
基于通用性思索,仅撑持导出尺度数据范例
--*/

/*--挪用示例

--导出dBase
p_exporttb@tbname=区域材料,@path=c:,@over=0
--*/
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)=,--文件名,默许为表名
@overbit=0--是不是掩盖已存在的文件,假如不掩盖,则间接追加
as
declare@errint,@srcnvarchar(255),@descnvarchar(255),@outint
declare@objint,@constrnvarchar(1000),@sqlvarchar(8000),@fdlistvarchar(8000)

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

--反省文件是不是已存在
ifright(@path,1)set@path=@path+
createtable#tb(abit,bbit,cbit)
set@sql=@path+@fname
insertinto#tbexecmaster..xp_fileexist@sql
ifexists(select1from#tbwherea=1)
if@over=1
begin
set@sql=del+@sql
execmaster..xp_cmdshell@sql,no_output
end
else
set@over=0
else
set@over=1

--数据库创立语句
set@sql=@path+@fname
set@constr=Provider=Microsoft.Jet.OLEDB.4.0;ExtendedProperties="dBASE5.0;
+;HDR=NO;DATABASE=+@path+"

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

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

--创立表的SQL
select@sql=,@fdlist=
select@fdlist=@fdlist+,+a.name
,@sql=@sql+,[+a.name+]
+casewhenb.namein(char,nchar,varchar,nvarchar)then
text(+cast(casewhena.length>250then250elsea.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[+@fname
+](+substring(@sql,2,8000)+)
,@fdlist=substring(@fdlist,2,8000)

if@over=1
begin
exec@err=sp_oamethod@obj,execute,@outout,@sql
if@err0gotolberr
end

exec@err=sp_oadestroy@obj

set@sql=openrowset(MICROSOFT.JET.OLEDB.4.0,dBase5.0;DATABASE=
+@path+,select*from[+@fname+])

--导进数据
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






/*--数据导出dBase

导出查询语句中的数据到dBase,假如文件不存在,将主动创立文件
基于通用性思索,仅撑持导出尺度数据范例
--*/

/*--挪用示例

--导出dBase
p_exporttb@sqlstr=select*from区域材料,@path=c:,@over=1
--*/

ifexists(select*fromdbo.sysobjectswhereid=object_id(N[dbo].[p_exporttb])andOBJECTPROPERTY(id,NIsProcedure)=1)
dropprocedure[dbo].[p_exporttb]
GO

createprocp_exporttb
@sqlstrvarchar(8000),--要导出的查询名
@pathnvarchar(1000),--文件寄存目次
@fnamenvarchar(250)=temp.dbf,--文件名,默许为temp
@overbit=0--是不是掩盖已存在的文件,假如不掩盖,则间接追加
as
declare@errint,@srcnvarchar(255),@descnvarchar(255),@outint
declare@objint,@constrnvarchar(1000),@sqlvarchar(8000),@fdlistvarchar(8000)

--参数检测
ifisnull(@fname,)=set@fname=temp.dbf

--反省文件是不是已存在
ifright(@path,1)set@path=@path+
createtable#tb(abit,bbit,cbit)
set@sql=@path+@fname
insertinto#tbexecmaster..xp_fileexist@sql
ifexists(select1from#tbwherea=1)
if@over=1
begin
set@sql=del+@sql
execmaster..xp_cmdshell@sql,no_output
end
else
set@over=0
else
set@over=1

--数据库创立语句
set@sql=@path+@fname
set@constr=Provider=Microsoft.Jet.OLEDB.4.0;ExtendedProperties="dBASE5.0;
+;HDR=NO;DATABASE=+@path+"

--创立表的SQL
declare@tbnamesysname
set@tbname=##tmp_+convert(varchar(38),newid())
set@sql=select*into[+@tbname+]from(+@sqlstr+)a
exec(@sql)

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

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

--创立表的SQL
select@sql=,@fdlist=
select@fdlist=@fdlist+,+a.name
,@sql=@sql+,[+a.name+]
+casewhenb.namein(char,nchar,varchar,nvarchar)then
text(+cast(casewhena.length>250then250elsea.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[+@fname
+](+substring(@sql,2,8000)+)
,@fdlist=substring(@fdlist,2,8000)

if@over=1
begin
exec@err=sp_oamethod@obj,execute,@outout,@sql
if@err0gotolberr
end

exec@err=sp_oadestroy@obj

set@sql=openrowset(MICROSOFT.JET.OLEDB.4.0,dBase5.0;DATABASE=
+@path+,select*from[+@fname+])

--导进数据
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


导致了一个使用几乎和mSQL一样的API接口的用于他们的数据库的新的SQL接口的产生,这样,这个API被设计成允许为用于mSQL而写的第三方代码更容易移植到MySQL。
谁可相欹 该用户已被删除
沙发
发表于 2015-1-19 14:08:48 | 只看该作者
相信各位对数据库和怎么样学习数据库都有一些经验和看法,也会有人走了一些弯路总结出自己的经验来,希望大家能把各自的看法和经验拿出来分享,给别人一份帮助,给自己一份快乐
小妖女 该用户已被删除
板凳
发表于 2015-1-26 10:13:18 | 只看该作者
而SQLServer如果能像Oracle一样可以为登陆分配如:5%的cpu,10%的内存。就可以解决这个漏洞。
山那边是海 该用户已被删除
地板
发表于 2015-2-4 14:35:05 | 只看该作者
个人感觉没有case直观。而且默认的第三字段(还可能更多)作为groupby字段很容易造成新手的错误。
简单生活 该用户已被删除
5#
发表于 2015-2-10 02:09:58 | 只看该作者
如果处理少量数据,比如几百条记录的数据,我不知道这两种情况哪个效率更高,如果处理大量数据呢?比如有表中有20万条记录.
若相依 该用户已被删除
6#
发表于 2015-2-28 15:21:39 | 只看该作者
总感觉自己还是不会SQL
爱飞 该用户已被删除
7#
发表于 2015-3-10 01:03:49 | 只看该作者
我是新手,正在学习数据库和操作系统,深感理论的泛广,唯有一步一步来,但是又感觉时间不够,收集了很多资料却总是没能认真的看完,希望有一个讨论板块,大家共同解决,共同分享,共同努力
海妖 该用户已被删除
8#
发表于 2015-3-17 04:07:48 | 只看该作者
而写到本地,我又考虑到效率问题.大家来讨论讨论吧,分数不打紧,就给10分,十全十美,没啥对错,各抒己见,但是要有说服力的哦~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-12-23 05:54

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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