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。 相信各位对数据库和怎么样学习数据库都有一些经验和看法,也会有人走了一些弯路总结出自己的经验来,希望大家能把各自的看法和经验拿出来分享,给别人一份帮助,给自己一份快乐 而SQLServer如果能像Oracle一样可以为登陆分配如:5%的cpu,10%的内存。就可以解决这个漏洞。 个人感觉没有case直观。而且默认的第三字段(还可能更多)作为groupby字段很容易造成新手的错误。 如果处理少量数据,比如几百条记录的数据,我不知道这两种情况哪个效率更高,如果处理大量数据呢?比如有表中有20万条记录. 总感觉自己还是不会SQL 我是新手,正在学习数据库和操作系统,深感理论的泛广,唯有一步一步来,但是又感觉时间不够,收集了很多资料却总是没能认真的看完,希望有一个讨论板块,大家共同解决,共同分享,共同努力 而写到本地,我又考虑到效率问题.大家来讨论讨论吧,分数不打紧,就给10分,十全十美,没啥对错,各抒己见,但是要有说服力的哦~
页:
[1]