【问题标题】:SSIS Expression cannot be evaluated -- why not?无法评估 SSIS 表达式 - 为什么不呢?
【发布时间】:2019-01-24 22:21:20
【问题描述】:

我在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 对函数“子字符串”无效。长度参数不能为负数。将长度参数更改为零或正值。

【问题讨论】:

  • 更多信息:我在参数窗口中单击变量 FileName 最右侧的 Expression Builder。
  • -1 被评估为负一,但目的是将其评估为负一。如何让表达式生成器将其视为负 1 而不是负 1。
  • 减一和负一是一回事。在这种模式中,当 FINDSTRING 部分找不到任何内容并返回 0 时,就会发生该错误。首先仅评估 FINDSTRING 位并确认它没有返回 0。不要尝试调试大型内联表达式一口气。验证其中的一部分并构建它们。
  • 如果你正在做很多时髦的路径/文件的东西,可能值得在脚本任务中使用更友好的方法来做
  • 感谢 Nick.McDemaid,我已经验证了各个部分,如果 -1 不存在,我现在会返回 \LDR01102019.txt 的文件名。我想我要继续做一个脚本任务,因为这个解析器不允许我返回 FINDSTRING(REVERSE(@[User::FileFullPathLDR] ),"\\",1)-1) 作为一个整数对于 Substring 长度参数,而是将 -1 视为 Substring 函数的最终无效参数。

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


【解决方案1】:

我测试了这个表达式:

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

针对这个测试字符串:

C:\Folder1\Folder2\FileName.TXT

它返回了

FileName.TXT

没有错误

我通过创建一个变量并为它定义一个表达式来测试它,然后评估该表达式。

【讨论】:

  • 这个语句就像我一直在测试并得到错误的语句,但唯一的区别是 FileFullPathLDR 是一个没有初始值的变量,因为这是从程序传入的,因为多个文件是在 ForEach 循环中读取。您的解决方案使我继续将 FileFullPathLDR 初始化为 c:\temp\FileName.txt 的虚拟值,然后解析器正常关闭,我现在得到正确的文件名。谢谢尼克。
【解决方案2】:

你可以试试下面的表达式:

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

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

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

参考文献

【讨论】:

    【解决方案3】:

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

    如果您还需要它处理空字符串,如果还没有\\,您可以在它前面添加一个\\,使用FINDSTRING(@[User::FileFullPathLDR],"\\",1) == 0 ? "\\"+ @[User::FileFullPathLDR] : @[User::FileFullPathLDR]之类的东西

    所以整个事情将是:

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

    所以,如果不存在\,它只会返回字符串本身。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-26
      相关资源
      最近更新 更多