declare @cmd nvarchar(2000) declare @messageID nvarchar(200) declare @serialID nvarchar(200) declare @oldfilename nvarchar(500) declare @filename nvarchar(500) declare @filePath nvarchar(4000) declare @oldfilePath nvarchar(4000) --将路径D:改成D$ declare @newfilePath nvarchar(4000) declare ccur cursor for select d.MessageID,m.serialID,m.Attachmentname,m.AttachmentPath from d left join r on d.MessageID=r.MessageID left join DataAttachment m on m.MessageID=d.MessageID where d.messageID='0.abe3b3d58161ccb3de7ab63754bb3f15' --通过数据库查找所需要的附件 open ccur fetch ccur into @messageID,@serialID,@filename,@filePath while @@fetch_status=0 begin --判断附件文件名中是否含有特殊字符 if CHARINDEX('+',@filename)>0 or CHARINDEX('$',@filename)>0 or CHARINDEX('&',@filename)>0 --含有+、$、& begin set @oldfilename=@filename set @filename=replace(@filename,'+','') set @filename=replace(@filename,'$','&','') --过滤这些特殊字符,替换后新的文件名 set @newfilePath=dbo.GetDirectoryPath(@filePath) + '\' + @filename --新路径名(<span >dbo.GetDirectoryPath方法为根据路径获取文件目录</span><span >)</span> --旧路径名更改成磁盘驱动 set @oldfilePath=replace(@filePath,'D:','D$') set @oldfilePath='\192.168.21.36\' + @oldfilePath --附件在远程服务器下面,如果不是远程,不用加磁盘路径 -- exec master.dbo.xp_cmdshell 'net use \<span >192.168.21.36</span><span >\d$ "123456" /user:"192.168.21.36\administrator"'</span> --exec master.dbo.xp_cmdshell 'ren \<span >\d$\Book1.xls,Book2.xls'</span> set @cmd='ren ' + @oldfilePath + ',' + @filename + '' --拼凑需要自行的命令 --修改文件物理位置名称(连接远程服务器及其需要修改文件名所在的盘符) exec master.dbo.xp_cmdshell 'net use \192.168.21.36\d$ "123456" /user:"192.168.21.36\administrator"' exec master.dbo.xp_cmdshell @cmd --@cmd的长度必须设置具体数据,不能设置为nvarchar(max),会报“过程需要类型为 'varchar' 的参数 'command_string'”错误 --插入文件名修改日志表 insert into DatafilenameUpdateLog(messageID,oldfilename,newfilename,oldfilePath,newfilePath) values(@messageID,@oldfilename,@filename,@filePath,@newfilePath) --根据serialID更新新文件名和新路径(serialID为唯一性) update A set Attachmentname=@filename,AttachmentPath=@newfilePath where serialID=@serialID --给我插入消息提醒 declare @content nvarchar(max) set @content='集团来文附件名含有特殊符号,已过滤,请注意查看。serialID:' + @serialID + ',messageID:' + @messageID + ',原文件名:' + @oldfilename + ',新文件名:' + @filename + '(系统自动发送)' exec aa.dbo.[aaRemind] 0,'',11182,@content end fetch ccur into @messageID,@filePath end close ccur deallocate ccur end
根据路径获取文件目录dbo.GetDirectoryPath方法
-- ============================================= -- Author: Paul Griffin -- Create date: 18 January 2015 -- Description: Returns the path without the file name -- from a full path: -- D:\Temp\Resources\Images\My.Picture.jpg -- ==> D:\Temp\Resources\Images -- ============================================= CREATE FUNCTION [dbo].[GetDirectoryPath] ( @Path NVARCHAR(MAX) ) RETURNS NVARCHAR(MAX) AS BEGIN DECLARE @filename NVARCHAR(MAX) DECLARE @Reversedpath NVARCHAR(MAX) DECLARE @PathLength INT SET @Reversedpath = REVERSE(@Path) SELECT @PathLength = CHARINDEX('\',@Reversedpath) SELECT @filename = left(@Path,LEN(@Path) - @PathLength) RETURN @filename END总结
以上是内存溢出为你收集整理的SQLServer过滤文件名特殊字符(利用SQLServer修改文件物理地址名称)全部内容,希望文章能够帮你解决SQLServer过滤文件名特殊字符(利用SQLServer修改文件物理地址名称)所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)