SQL多文件格式字符串匹配问题:需动态传格式且LIKE语句失效
解决SQL Server检查文件名是否包含指定格式列表的问题
你的代码无法运行的核心原因是:SQL Server的LIKE运算符不支持正则表达式的分组多选语法(png|jpg|svg|gif),这种写法只会匹配字面意义上包含(png|jpg|svg|gif)的字符串,而非匹配任意一种后缀。
下面提供两种实用的实现方案,支持传入格式列表变量,无需硬写OR运算符:
方案1:使用字符串拆分(SQL Server 2016+推荐)
利用STRING_SPLIT函数将格式列表拆分成行,再通过EXISTS检查是否匹配任意后缀:
创建存储过程
CREATE PROCEDURE CheckFileHasTargetExtension @FileName nvarchar(max), @TargetExtensions nvarchar(max) -- 逗号分隔的格式列表,如'png,jpg,svg,gif' AS BEGIN SET NOCOUNT ON; SELECT CASE WHEN EXISTS ( SELECT 1 FROM STRING_SPLIT(@TargetExtensions, ',') WHERE @FileName LIKE '%.' + VALUE + '%' -- 用%.确保匹配的是文件后缀,避免误匹配文件名中的子串 ) THEN 'true' ELSE 'false' END AS MatchResult; END
调用示例
-- 匹配成功,返回true EXEC CheckFileHasTargetExtension 'somefile.png', 'png,jpg,svg,gif'; -- 匹配失败,返回false EXEC CheckFileHasTargetExtension 'document.txt', 'png,jpg,svg,gif';
方案2:兼容低版本SQL Server(2016以下)
如果你的SQL Server版本不支持STRING_SPLIT,可以先创建一个自定义字符串拆分函数,再复用上述逻辑:
创建拆分函数
CREATE FUNCTION dbo.SplitCommaSeparatedString ( @InputString nvarchar(max), @Delimiter char(1) = ',' ) RETURNS @SplitResults TABLE (Extension nvarchar(max)) AS BEGIN DECLARE @StartPos int = 1; DECLARE @EndPos int; -- 确保字符串末尾有分隔符,避免遗漏最后一项 IF RIGHT(@InputString, 1) <> @Delimiter SET @InputString = @InputString + @Delimiter; WHILE CHARINDEX(@Delimiter, @InputString, @StartPos) > 0 BEGIN SET @EndPos = CHARINDEX(@Delimiter, @InputString, @StartPos); INSERT INTO @SplitResults(Extension) VALUES(SUBSTRING(@InputString, @StartPos, @EndPos - @StartPos)); SET @StartPos = @EndPos + 1; END RETURN; END
适配后的存储过程
CREATE PROCEDURE CheckFileHasTargetExtension @FileName nvarchar(max), @TargetExtensions nvarchar(max) AS BEGIN SET NOCOUNT ON; SELECT CASE WHEN EXISTS ( SELECT 1 FROM dbo.SplitCommaSeparatedString(@TargetExtensions, ',') WHERE @FileName LIKE '%.' + Extension + '%' ) THEN 'true' ELSE 'false' END AS MatchResult; END
注意事项
- 用
%.拼接后缀是为了避免误匹配,比如防止filepng.txt被判定为匹配png格式; - 如果需要严格匹配文件名末尾的后缀(而非包含),可以把条件改成
RIGHT(@FileName, LEN(VALUE)) = VALUE,记得处理文件名中没有.的情况。
内容的提问来源于stack exchange,提问作者Gnihc
相关产品推荐
相关产品推荐

