日期:2014-05-17  浏览次数:20532 次

SQL2008截取
有三个文件名称:
G0858号_归档文件目录.pdf
G0858号_中华人民共和国_中央人民政府(2009)16号_对外贸易会签联系单_2009-5-27.pdf
G0858号_中央人民政府_储备(2009)16号_G0858号地底价表_2009-5-27.pdf

我想截取到“归档文件目录.pdf”,“地登记交易会签联系单”,“G0858号地底价表”这三部分,情歌为大虾给个提示。

------解决方案--------------------
_2009-5-27 这个不好处理。
------解决方案--------------------
用_分割一下,然后用isdate() 判断一下,取扩展名前面的最后一个非时间的字符串。
------解决方案--------------------
SQL code

IF EXISTS (SELECT 1 FROM SYSOBJECTS WHERE name = 'fn_subword')
BEGIN
    DROP FUNCTION fn_subword
END
GO
CREATE FUNCTION fn_subword(@memo VARCHAR(1000))
RETURNS VARCHAR(1000)
AS
BEGIN
DECLARE @REVERSE VARCHAR(1000)= REVERSE(@memo)
DECLARE @Submemo VARCHAR(1000)
SET @Submemo = SUBSTRING(@REVERSE,CHARINDEX('.',@REVERSE) + 1,CHARINDEX('_',@REVERSE) - CHARINDEX('.',@REVERSE) - 1)

IF ISDATE(REVERSE(@Submemo)) = 1
BEGIN
    SET @REVERSE = REPLACE(@REVERSE,@Submemo + '_','')
    SET @Submemo = SUBSTRING(@REVERSE,CHARINDEX('.',@REVERSE) + 1,CHARINDEX('_',@REVERSE) - CHARINDEX('.',@REVERSE) - 1)
END


RETURN REVERSE(@Submemo)

END 
GO
DECLARE @Str VARCHAR(1000) = 'G0858号_中华人民共和国_中央人民政府(2009)16号_对外贸易会签联系单_2009-5-27.pdf'

SELECT dbo.fn_subword(@Str)