飞奔·慢行
===========================================================
mssql里学生照片批量导入数据库的语句
===========================================================
--功能:根据学校提供的学生照片执行下面语句,可以批量的导入数据库

--exec p_insertimage_kyle 'kyle','user','resu','zjhy'
/*+++++++++++++说明+++++++++++++
思路:将xs_freshman表里有学号无照片的学生处理后插入到辅助表store里,然后通过扩展存储过程xp_fileexist判断学号和照片名称是否相同,如果一样的话使用textcopy逐条将有正确学号的照片插回到辅助表store里(这里不是使用临时表,是因为textcopy不支持临时表),然后利用游标逐条的从辅助表store里取出每一个学号,将照片本身和尺寸插入到正式的照片表xz_imagestore里。
需要注意的是:这里是通过删除已经插入系统的学生照片来确定照片确实存在,但文件名因为笔误写错而跟学号不一致的学生的。
这些因为文件名笔误而无法插入的学生请到相应的存放照片的文件夹下查看。事前先将客户的学生照片备份一份。
限制说明:1.校园网软件的新生入学登记里必须有学生的信息(学生信息列里必须加上学号或者身份证号来唯一的标识某个学生)
2.学生的照片必须以学号命名(如果以身份证号命名,下面语句所有的xh字段都改成字段sfzh即可),学号最长为30位,身份证号为15或18位
3.图片限定某个时点只能用一种格式,这里语句里默认为jpg格式,如要修改,将jpg替换成合法的图片后缀即可
4.默认让学校在e盘上建个名为photo的目录,用于存放学生照片,如要修改存放照片的目录,将下面语句里的e:\photo替换掉即可
5.因为是用游标处理,理论上说学生照片越多处理时间越长,请耐心等待
使用说明:1.选中公司数据库,先执行下面的整个存储过程
2.接着执行如下的格式:exec p_insertimage_kyle '服务器名','登陆用户名','相应密码','数据库名'
注意要有单引号引起来。这里的功能是批量的插入学生的照片
3.因为存储过程使用了游标逐条判断,这种行为将占用比较多的cpu资源。当存储过程统计最后结果时,也许你无法操作查询分析器。
4.插入的照片越多产生的日志就越大,事后请帮用户备份数据库,然后截断日志。截断日志的语句如下(注意单引号要写上):
backup log dbname with no_log
dbcc shrinkdatabase('dbname') --dbname为校园网软件的后台数据库名称
注意事项:代码使用了sqlserver的textcopy.exe这样一个工具,如果不能插入照片,是因为sqlserver的path路径没打通的缘故,手工搜索textcopy.exe这个可执行文件,拷贝到winnt\system32(或winnt下,请在dos用path命令自己看打通的路径)下即可解决
+++++++++++++说明+++++++++++++*/

if exists (select * from sysobjects where objectproperty(object_id('p_insertimage_kyle'), 'isprocedure')=1)
drop procedure p_insertimage_kyle
go
create proc p_insertimage_kyle(
@srvname varchar (20), --服务器名
@login varchar (20), --登陆用户名
@password varchar (30), --相应密码
@dbname varchar (20) --数据库名
)
as
begin
set nocount on
--将照片表里没有实际照片的记录删去
delete xz_imagestore where imagesize is null or datalength(imagedata)=2
--产生一个与xz_imagestore表结构一模一样的辅助空表store,用来存放所有有学号而系统里没有照片的学生,并且在这张表里增加一个具有30位字符型的xh(学号)列用来后面的关联
if exists (select * from sysobjects where objectproperty(object_id('store'),'istable')=1)
drop table store
select *,'1234567890abcdefghijklmnopqrst' xh into store from xz_imagestore where 1=2
--在表store上建立聚集索引
create clustered index store_xh on store(xh)
--将数据库里有学号无照片的学生的id和xh等字段导入store表,type为2表示学生为1表示老师
insert store(id,xh,type,imagecontenttype,imagedata)
select id,xh,2,'jpg','ox' from xs_freshman where xh is not null and id not in(select id from xz_imagestore where type=2)
declare @sql varchar(500) --存放插入照片的语句
declare @xh varchar(30) --存放游标取出的每一个学号
declare @imagesize int --要处理的照片的大小
declare @imagename varchar(500) --存放照片文件名
declare @del varchar(500) --存放即将删除的已插入的学生照片的语句
declare @flag int --判断照片是否存在的标识符
--建立表变量@image用来存放有学号且硬盘上有照片的学生名单
declare @image table(xh varchar(30) primary key)
--建立游标取有学号有照片的学号
declare cur_xz_imagestore cursor for select xh from store
open cur_xz_imagestore
--取出第一个要处理的学号
fetch cur_xz_imagestore into @xh
--游标开始取数遍历store整个表
while @@fetch_status=0
begin
set @imagename='e:\photo\'+@xh+'.jpg'
exec master..xp_fileexist @imagename,@flag out
if @flag=1
begin
--照片插入到store表里
select @xh=cast(@xh as varchar(30))
set @sql=' textcopy /s '+@srvname+' /u '+@login+' /p '
+@password+' /d '+@dbname+' /t '+' store '+' /c '+' imagedata '
+' /w '+'" where xh='+''''+@xh+'''"'+ ' /f '+ 'e:\photo\'+@xh+'.jpg'+' /i '
exec master..xp_cmdshell @sql,no_output
/*通过datalength函数取得照片的大小,将store表里的内容插入到正式的照片表xz_imagestore里,
同时删除硬盘上本次已插入系统的学生照片,记录本次插进去的学号到表变量@image里,并且在store表里删去这个学号*/
insert xz_imagestore(id,imagedata,imagecontenttype,imagesize,type)
select id,imagedata,imagecontenttype,datalength(imagedata),type
from store where xh=@xh
select @del='del '+'e:\photo\'+@xh+'.jpg'
exec master..xp_cmdshell @del,no_output
insert @image select @xh
delete store where xh=@xh
end --if
--推进游标取下一条记录
fetch cur_xz_imagestore into @xh
end --while
--关闭游标
close cur_xz_imagestore
deallocate cur_xz_imagestore
set nocount off
select count(1) as '本次导入系统的学生总数'from @image
select a.bh as '本次导入系统的学生班号',a.xh as '本次导入系统的学生学号',a.xm as '本次导入系统的学生姓名'
from xs_freshman a,@image b where a.xh=b.xh
select bh as '没有输入学号的学生的班号',xh as '没有输入学号的学生的学号',xm as '没有输入学号的学生的姓名' from xs_freshman where xh is null
select count(1) as '有学号无照片的所有的学生总数' from store
select a.bh as '有学号无照片的学生班号',a.xh as '有学号无照片的学生学号',a.xm as '有学号无照片的学生姓名'
from xs_freshman a, store b where a.xh=b.xh
if exists (select * from sysobjects where objectproperty(object_id('store'),'istable')=1)
drop table store
end

kyle 发表于:2005.12.25 20:22 ::分类: ( dbms ) ::阅读:(1333次) :: 评论 (1)
re: mssql里学生照片批量导入数据库的语句 [回复]

你好,我这里有一个电子档案管理系统,是在网上找的破解的,叫电子档案之人事管理系统V4.3版,我在公司用,公司有好几千人,可是这个软件不能批量的导入照片,请问可以改动吗?我的QQ是6352064。希望您的帮助。谢谢

听潮 评论于: 2007.11.15 15:29

发表评论
标题

在此添加评论
表情符号: smile laughing tongue angry crying sad wassat wink

称呼

邮箱地址(可选)

个人主页(可选)

 authimage


自我介绍
切换风格
新闻聚合
博客日历
文章归档...
最新发表...
最新评论...
博客统计...
Blog信息
网站链接...