我在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参数更改为零或正值。
答案 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
)
)
因此,如果不存在\
,它将只返回字符串本身。