Выражение SSIS не может быть оценено - почему нет? - PullRequest
0 голосов
/ 25 января 2019

У меня есть переменная в SSIS package name User::FileFullPathLDR.Из этой переменной во время выполнения пакета служб SSIS я хочу извлечь имя файла из FileFullPathLDR и поместить его в другую переменную с именем User::FileName.

Я пробовал все типы комбинаций, чтобы попытаться получить этот код врешай в Expression Builder, чтобы решить, кроме как стоять на моей голове с горящим ладаном, говоря ОМ 4 миллиона раз, и, похоже, ничего не работает.

Я поместил следующее выражение в Expression Builder для переменной User :: FileName:

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

Из полного пути я ожидаю получить имя файла, подобное: LDRFile01242019.txt.

Но я продолжаю получать следующую ошибку, когда построитель выражений анализирует этот оператор:

Длина -1 недопустима для функции "Подстрока".Параметр длины не может быть отрицательным.Измените параметр длины на ноль или положительное значение.

Ответы [ 3 ]

0 голосов
/ 25 января 2019

Вы можете попробовать следующее выражение:

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

Также попробуйте добавить условный оператор, чтобы избежать ошибок с ошибками:

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

Ссылки

0 голосов
/ 25 января 2019

Часть FINDSTRING(@[User::FileFullPathLDR],"\\",1) возвращает 0, если FileFullPathLDR не содержит \.Поскольку вы вычитаете -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
    )
)

Итак, если \ отсутствует, он просто вернет саму строку.

0 голосов
/ 25 января 2019

Я протестировал это выражение:

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

с этой тестовой строкой:

C:\Folder1\Folder2\FileName.TXT

, и оно вернуло

FileName.TXT

Не было ошибки

Я проверил это, создав переменную и определив для нее выражение, а затем оценив это выражение.

...