透明 发表于 2015-1-16 22:28:41

MSSQL教程之导进/导出dBase

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

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

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


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


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



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



/*--数据导出dBase

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

/*--挪用示例

--导出dBase
p_exporttb@tbname=区域材料,@path=c:,@over=0
--*/
ifexists(select*fromdbo.sysobjectswhereid=object_id(N.)andOBJECTPROPERTY(id,NIsProcedure)=1)
dropprocedure.
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.)andOBJECTPROPERTY(id,NIsProcedure)=1)
dropprocedure.
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字段很容易造成新手的错误。

简单生活 发表于 2015-2-10 02:09:58

如果处理少量数据,比如几百条记录的数据,我不知道这两种情况哪个效率更高,如果处理大量数据呢?比如有表中有20万条记录.

若相依 发表于 2015-2-28 15:21:39

总感觉自己还是不会SQL

爱飞 发表于 2015-3-10 01:03:49

我是新手,正在学习数据库和操作系统,深感理论的泛广,唯有一步一步来,但是又感觉时间不够,收集了很多资料却总是没能认真的看完,希望有一个讨论板块,大家共同解决,共同分享,共同努力

海妖 发表于 2015-3-17 04:07:48

而写到本地,我又考虑到效率问题.大家来讨论讨论吧,分数不打紧,就给10分,十全十美,没啥对错,各抒己见,但是要有说服力的哦~
页: [1]
查看完整版本: MSSQL教程之导进/导出dBase