兰色精灵 发表于 2015-1-16 22:28:41

MSSQL编程:数据库中存/取文件

支持多线程,充分利用CPU资源数据|数据库
SQL数据库顶用image来存储文件,但SQL没有供应间接的存取文件的命令.

/*--bcp完成二进制文件的导进导出

撑持image,text,ntext字段的导进/导出
image合适于二进制文件,包含:Word文档,Excel文档,图片,音乐等
text,ntext合适于文本数据文件

注重:导进时,将掩盖满意前提的一切行
导出时,将把一切满意前提的行导出到指定文件中


此存储历程仅用bcp完成
-----------------*/

/*--挪用示例
--数据导出
execp_binaryIOzj,,,acc_演示数据..tb,img,c:zj1.dat

--数据导进
execp_binaryIOzj,,,acc_演示数据..tb,img,c:zj1.dat,,0
--*/
ifexists(select*fromdbo.sysobjectswhereid=object_id(N.)andOBJECTPROPERTY(id,NIsProcedure)=1)
dropprocedure.
GO

Createprocp_binaryIO
@servenamevarchar(30),--服务器称号
@usernamevarchar(30),--用户名
@passwordvarchar(30),--暗码
@tbnamevarchar(500),--数据库..表名
@fdnamevarchar(30),--字段名
@fnamevarchar(1000),--目次+文件名,处置过程当中要利用/掩盖:@filename+_temp
@tjvarchar(1000)=,--处置前提.关于数据导进,假如前提中包括@fdname,请指定表名前缀
@isoutbit=1--1导出((默许),0导进
AS
declare@fname_invarchar(1000)--bcp处置应对文件名
,@fsizevarchar(20)--要处置的文件的巨细
,@m_tbnamevarchar(50)--一时表名
,@sqlvarchar(8000)

--则获得导进文件的巨细
if@isout=1
set@fsize=0
else
begin
createtable#tb(可选名varchar(20),巨细int
,创立日期varchar(10),创立工夫varchar(20)
,前次写操纵日期varchar(10),前次写操纵工夫varchar(20)
,前次会见日期varchar(10),前次会见工夫varchar(20),特征int)
insertinto#tb
execmaster..xp_getfiledetails@fname
select@fsize=巨细from#tb
droptable#tb
if@fsizeisnull
begin
print文件未找到
return
end

end

--天生数据处置应对文件
set@m_tbname=[##temp+cast(newid()asvarchar(40))+]
set@sql=select*into+@m_tbname+from(
selectnullas范例
unionallselect0as前缀
unionallselect+@fsize+as长度
unionallselectnullas停止
unionallselectnullas格局
)a
exec(@sql)
select@fname_in=@fname+_temp
,@sql=bcp"+@m_tbname+"out"+@fname_in
+"/S"+@servename
+casewhenisnull(@username,)=then
else"/U"+@usernameend
+"/P"+isnull(@password,)+"/c
execmaster..xp_cmdshell@sql
--删除一时表
set@sql=droptable+@m_tbname
exec(@sql)

if@isout=1
begin
set@sql=bcp"selecttop1+@fdname+from
+@tbname+caseisnull(@tj,)whenthen
elsewhere+@tjend
+"queryout"+@fname
+"/S"+@servename
+casewhenisnull(@username,)=then
else"/U"+@usernameend
+"/P"+isnull(@password,)
+"/i"+@fname_in+"
execmaster..xp_cmdshell@sql
end
else
begin
--为数据导进筹办一时表
set@sql=selecttop0+@fdname+into
+@m_tbname+from+@tbname
exec(@sql)

--将数据导进光临时表
set@sql=bcp"+@m_tbname+"in"+@fname
+"/S"+@servename
+casewhenisnull(@username,)=then
else"/U"+@usernameend
+"/P"+isnull(@password,)
+"/i"+@fname_in+"
execmaster..xp_cmdshell@sql

--将数据导进到正式表中
set@sql=update+@tbname
+set+@fdname+=b.+@fdname
+from+@tbname+a,
+@m_tbname+b
+caseisnull(@tj,)whenthen
elsewhere+@tjend
exec(@sql)

--删除数据处置一时表
set@sql=droptable+@m_tbname
end

--删除数据处置应对文件
set@sql=del+@fname_in
execmaster..xp_cmdshell@sql

go


出于效率方面的考虑,InnoDB数据表的数据行级锁定实际发生在它们的索引上,而不是数据表自身上。显然,数据行级锁定机制只有在有关的数据表有一个合适的索引可供锁定的时候才能发挥效力。

山那边是海 发表于 2015-1-19 14:04:03

如果你是从“学习某一种数据库应用软件,从而获得应聘的资本和工作机会”的角度来问的话。

小妖女 发表于 2015-2-4 14:22:57

而SQLServer如果能像Oracle一样可以为登陆分配如:5%的cpu,10%的内存。就可以解决这个漏洞。

乐观 发表于 2015-2-10 02:00:34

如果我们从集合论(关系代数)的角度来看,一张数据库的表就是一组数据元的关系,而每个SQL语句会改变一种或数种关系,从而产生出新的数据元的关系(即产生新的表)。

再见西城 发表于 2015-2-28 15:12:48

如果是将来做数据库的开发设计,就应该详细学习T-SQL的各种细节,包括T-SQL的程序设计、存储过程、触发器以及具体使用某个开发语言来访问数据库。

若天明 发表于 2015-3-10 00:50:51

外键的级联更能扩展可能大部分的同行在设计OLTP系统的时候都不愿意建立外键,都是通过程序来控制父子数据的完整性。

灵魂腐蚀 发表于 2015-3-17 03:49:03

然后最好有实践机会,能够把实践到的和实践结合起来,其实理论思考是个非常困扰和痛苦的事情

admin 发表于 2015-3-23 18:13:39

如果我们从集合论(关系代数)的角度来看,一张数据库的表就是一组数据元的关系,而每个SQL语句会改变一种或数种关系,从而产生出新的数据元的关系(即产生新的表)。
页: [1]
查看完整版本: MSSQL编程:数据库中存/取文件