仓酷云

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

[学习教程] MSSQL编程:数据库中存/取文件

[复制链接]
兰色精灵 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:28:41 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式

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

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

x
支持多线程,充分利用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[dbo].[p_binaryIO])andOBJECTPROPERTY(id,NIsProcedure)=1)
dropprocedure[dbo].[p_binaryIO]
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数据表的数据行级锁定实际发生在它们的索引上,而不是数据表自身上。显然,数据行级锁定机制只有在有关的数据表有一个合适的索引可供锁定的时候才能发挥效力。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-5-27 08:26

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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