Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
获取存储在SQL Server中的文件名_Sql_Sql Server 2005_Select - Fatal编程技术网

获取存储在SQL Server中的文件名

获取存储在SQL Server中的文件名,sql,sql-server-2005,select,Sql,Sql Server 2005,Select,直截了当的问题:) 我有一列存储在SQL Server中: FileName Attachments_21046_123400100473.pdf 我需要抓取文件扩展名之前的最后一段,在本例中,它将是123400100473 最后一段的字符大小可能有所不同,因此这里是12个字符,但有时可能是15个字符 最好的办法是什么 通过T-SQL和函数的组合,您可以很容易地实现这一点 这是一个有点黑客,但只取决于两个下划线和句点的存在。e、 g.%\u%%.%扩展名可以是任意长度,也可以是最终的子字

直截了当的问题:)

我有一列存储在SQL Server中:

FileName    Attachments_21046_123400100473.pdf
我需要抓取文件扩展名之前的最后一段,在本例中,它将是
123400100473

最后一段的字符大小可能有所不同,因此这里是12个字符,但有时可能是15个字符


最好的办法是什么

通过T-SQL和函数的组合,您可以很容易地实现这一点

这是一个有点黑客,但只取决于两个下划线和句点的存在。e、 g.
%\u%%.%
扩展名可以是任意长度,也可以是最终的子字符串:

编辑:更新以处理变量下划线出现:

create function udfGetFileNameSubstring(@val as varchar(50))
returns varchar(50)
begin   
    --declare @val varchar(50)
    --set @val = 'Attachments_21046_123400100473.pdf'

    declare @uidx int
    -- establish the index of the 2nd underscore
    set @uidx = LEN(@val) - CHARINDEX('_', REVERSE(@val)) + 1

    declare @pidx int
    -- establish the index of the period
    set @pidx = CHARINDEX('.', @val) 

    return SUBSTRING(@val, @uidx + 1, @pidx - @uidx - 1)
end

-- usage:  SELECT dbo.udfGetFileNameSubstring(col_name) FROM table_name
-- sample: SELECT dbo.udfGetFileNameSubstring('Attachments_21046_123400100473.pdf')
-- OUTPUT: 123400100473

T-SQL当然可以缩写,我会将它包装在UDF中,以便在您的查询中干净地使用。

选择子字符串(f.FileName,0,CHARINDEX('.',f.FileName))作为“last_segment”
我不确定最后一段前面有多少下划线,所以我反转字符串并找到第一个下划线

DECLARE @FileName VARCHAR(50)
SET @FileName = 'Attachments_21046_123400100473.pdf'

SELECT REVERSE(
        SUBSTRING(
        REVERSE(@FileName), 
        5, -- Length of extension + 1.
        CHARINDEX('_', REVERSE(@FileName)) - 5
    )
)

如果格式/长度始终相同。。这可能是最简单的

select left(right(@Filename,16),12)

您的答案将返回整个文件名。我正在尝试获取最后一段,请查看我在文件名示例下编写的内容。应该有足够的内容让您了解这一点。看看tsql字符串函数,它的格式总是一样的,实际上是“Attachments\u IDNumber\u SecondNumber.PDF”@RogueSpear00啊,嗯。。。不管怎么说,我还是把它保留下来,因为即使我知道前导下划线的数量,它看起来也不会更漂亮。@MichaelFredrickson:虽然这个解决方案会奏效,而且我确实喜欢聪明+1,但请注意,它取决于文件扩展名的长度始终是三个字母。它将以.vb或.html或任何其他非三个字母扩展名的形式存档。@PaulSasik Good point Paul。。。我的回答很可爱,但是你的代码放在UDF中可能是最健壮的解决方案。我在翻找一些数据,有些字段有多个下划线。然而,这些是我可以忽略的记录。这不会绊倒你的解决方案,是吗?@RogueSpear00:它会绊倒我的解决方案。我将调整它以处理变量下划线。@RogueSpear00:实际上,这是一个非常简单的修复。检查编辑的代码
select left(right(@Filename,16),12)