无法评估SSIS表达式-为什么不呢?

时间:2019-01-24 22:21:21

标签: sql-server ssis visual-studio-2017 expression etl

我在SSIS package name User::FileFullPathLDR中有变量。 我想从SSIS包运行时的该变量中提取FileFullPathLDR的文件名,并将其放在另一个名为User::FileName的变量中。

我尝试了所有类型的组合,以尝试使此代码在Expression Builder中解析,以解决该问题,只是站在我头顶上说烧了OM 400万次,但似乎没有任何效果。

我在表达式生成器中为变量User :: FileName输入了以下表达式:

REVERSE(SUBSTRING(REVERSE(@[User::FileFullPathLDR]),1,FINDSTRING(REVERSE(@[User::FileFullPathLDR] ),"\\",1)-1))

我希望从完整路径中获得类似于LDRFile01242019.txt.

的文件名。

但是当表达式生成器解析此语句时,我仍然收到以下错误:

  

长度-1对函数“子字符串”无效。长度参数不能为负。将length参数更改为零或正值。

3 个答案:

答案 0 :(得分:1)

我测试了这个表达式:

REVERSE(SUBSTRING(REVERSE(@[User::FileFullPathLDR]),1,FINDSTRING(REVERSE(@[User::FileFullPathLDR]),"\\",1)-1))

针对此测试字符串:

C:\Folder1\Folder2\FileName.TXT

它返回

FileName.TXT

没有错误

我通过创建一个变量并为其定义一个表达式,然后对该表达式求值来对其进行测试。

答案 1 :(得分:1)

您可以尝试以下表达式:

RIGHT(@[User::FileFullPathLDR],FINDSTRING(REVERSE(@[User::FileFullPathLDR]),"\\",1)-1)

还尝试添加条件运算符以避免错误值错误:

FINDSTRING(REVERSE(@[User::FileFullPathLDR]),"\\",1) == 0 ? "" : RIGHT(@[User::FileFullPathLDR],FINDSTRING(REVERSE(@[User::FileFullPathLDR]),"\\",1)-1)

参考

答案 2 :(得分:1)

如果FileFullPathLDR不包含FINDSTRING(@[User::FileFullPathLDR],"\\",1),则部分\返回0。由于您要减去-1,所以如果您的字符串与模式不匹配,或者如果变量是在运行时设置的(则在验证过程中可能有一个空字符串),则最终可能会得到负值。

如果您还需要它与空字符串一起使用,可以使用\\之类的东西在没有\\的情况下在其前面添加一个FINDSTRING(@[User::FileFullPathLDR],"\\",1) == 0 ? "\\"+ @[User::FileFullPathLDR] : @[User::FileFullPathLDR] < / p>

因此,整个过程将是:

REVERSE(
    SUBSTRING(
        REVERSE(
            @[User::FileFullPathLDR]),1,FINDSTRING(REVERSE(FINDSTRING(@[User::FileFullPathLDR],"\\",1) == 0 ? "\\"+ @[User::FileFullPathLDR] : @[User::FileFullPathLDR])
            ,"\\",1
        )-1
    )
)

因此,如果不存在\,它将只返回字符串本身。