子串取决于字符串中的分隔符

时间:2014-08-11 01:39:41

标签: sql sql-server stored-procedures sql-server-2012 ssis

我正在编写一个过程来处理SSIS中的文件名。

概述:

我在SSIS中的文本文件加载过程中捕获文件名。我编写了一个过程,以便将此文件名拆分为不同的组件,并以变量的形式返回值,我将在SSIS包中进一步使用。

Problem 
This file name is of the format @FileName ="FILE_DATE_REF_DATETIME".All I need 
to split this in a way like "FILE" , "DATE". I am able to achieve this by using
SUBSTRING(@Filename,0,CHARINDEX('_',@FileName))
and 

Substring(@FileName,CHARINDEX('_',@FileName)+1,CHARINDEX('_',SUBSTRING(@Filename,CHARINDEX('_',@Filename)+1,Len(@Filename)))-1)

但是这里的主要问题是当我们在FILE中获得额外的'_'时它完全出错了。任何人都可以建议我将上述文件名格式拆分为FILE和DATE的方法。

修改

FileNames的样本:

  • asdfkg_20140710_ets20140710_0525_theds

  • asdjjf_they_20140710_ets20140710_0525_theds

  • oiuth_theyb_wgb_20140710_ets20140710_0526_theds

我需要在20140710和20140710之前提取任何内容。

3 个答案:

答案 0 :(得分:1)

您可以使用PATINDEX代替CHARINDEX

来执行此操作
select SUBSTRING(@Filename,0,PATINDEX('%[_][0-9]%',@FileName))

答案 1 :(得分:0)

如果文件名的最后一部分更可靠(没有意外的下划线),你可以REVERSE它并使用CHARINDEX找到第四个下划线(并在之后再次反转子串)。

否则,如果你可以信任日期格式,你可以使用PATINDEX表达可怕的表达式,如

'%[_][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][_]%'

答案 2 :(得分:0)

不是最漂亮的但它会起作用。 LOL

DECLARE @FILE VARCHAR(55) = 'FILE_DATE_REF_DATETIME'
DECLARE @FILEFUN AS VARCHAR(55) = LEFT(@FILE,CHARINDEX('_',@FILE))
DECLARE @FILENAMEOUTPUT AS TABLE(Name Varchar(55))

WHILE LEN(@FILE) > 0
BEGIN
INSERT INTO @FILENAMEOUTPUT
SELECT REPLACE(@FILEFUN,'_','')
SET @FILE = REPLACE(@FILE,@FILEFUN,'')
SET @FILEFUN = iif(CHARINDEX('_',@FILE)=0,@FILE,LEFT(@FILE,CHARINDEX('_',@FILE)))
END

SELECT * FROM @FILENAMEOUTPUT