SQLServer过滤文件名特殊字符(利用SQLServer修改文件物理地址名称)

原创 2015年07月10日 15:36:15
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 @filename=replace(@filename,'&','')    --过滤这些特殊字符,替换后新的文件名
                       set @newFilePath=dbo.GetDirectoryPath(@filePath) + '\' + @filename  --新路径名(<span style="font-family: Arial, Helvetica, sans-serif;">dbo.GetDirectoryPath方法为根据路径获取文件目录</span><span style="font-family: Arial, Helvetica, sans-serif;">)</span>
                       --旧路径名更改成磁盘驱动
                       set @oldfilePath=replace(@filePath,'D:','D$')     
                       set @oldfilePath='\\192.168.21.36\' + @oldfilePath   --附件在远程服务器下面,如果不是远程,不用加磁盘路径
                       
                       -- exec master.dbo.xp_cmdshell 'net use \\<span style="font-family: Arial, Helvetica, sans-serif;">192.168.21.36</span><span style="font-family: Arial, Helvetica, sans-serif;">\d$ "123456" /user:"192.168.21.36\administrator"'</span>
                       --exec  master.dbo.xp_cmdshell   'ren   \\<span style="font-family: Arial, Helvetica, sans-serif;">192.168.21.36</span><span style="font-family: Arial, Helvetica, sans-serif;">\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,@serialid,@fileName,@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特殊字符/生僻字与varchar

对于中文版的SQL SERVER,默认安装后使用的默认排序规则为Chinese_PRC_CI_AS,在此排序规则下,使用varchar类型来可以“正常存取”存放中文字符以及一些东南亚国家的字符,同时v...

linux下rm命令删除文件名中包含特殊字符的文件

1. 删除带“-”的文件名的方法 大部分是由于误操作的原因,产生了一些 特殊字符的文件 如 -foo rm --help 用法:rm [选项]... 目录... Remove (unlink)...

SQLSERVER 筛选出数据包含特殊字符( 制表符、回车符、换行符)的字符型和text类型字段

1、首先拼接查询语句 -- 在查询出来的结果后面加上 ' null end as has_special_character ' select case when data_type l...

bootstrap fileinput.js扩展-增加对文件名特殊字符过滤

在项目中使用bootstrap fileinput.js作为文件上传插件的过程中,需求提出如果文件名中包含某些特殊字符,例如¥、#等,则不允许用户上传此类文件。fileinput.js本身并不支持文件...

Linux 下如何处理包含空格和特殊字符的文件名

注意:我们可能有各种类型的文件,但是为了简单以及方便实现,在本文中我们只用文本文件(.txt)做演示。 最常见的文件名例子: abc.txtavi.txtdebian.txt... ...

Linux 下如何处理包含空格和特殊字符的文件名

原文:http://www.tecmint.com/manage-linux-filenames-with-special-characters/作者: Avishek Kumar 译文:LCT...

Linux 下如何处理包含空格和特殊字符的文件名

原文:https://linux.cn/article-5777-1.html 我们经常会看到文件名和文件夹名。大多数时候文件/文件夹的名字和内容相关并以数字和字母开头。字母加数字的文件名最...

关于附件上传文件名包含特殊字符引起无发下载附件的问题解决办法

(1)不容许用户上传包含特殊字符的文件 在上传文件的时候,加上必要的效验;这个比较简单,改动量小。 另外文件名包含特殊字符的文件,比较少,原因是无法从键盘输入特殊字符!...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:SQLServer过滤文件名特殊字符(利用SQLServer修改文件物理地址名称)
举报原因:
原因补充:

(最多只允许输入30个字)