Оцененная переменная и успешно оцененный пакет в SSIS VS-2017 не работают при выполнении в ssms - PullRequest
2 голосов
/ 07 мая 2019

В VS-2017 я написал переменную с типом данных "строка".Эта переменная использует другую переменную, чтобы определить, с какого момента данные должны быть извлечены из базы данных.

Проблема в том, что выражение оценивается в VS успешно, пакет ssis может быть успешно выполнен, а сам запрос может быть выполнен в ssms.Когда пакет развертывается в ssms и выполняется по всему каталогу служб интеграции, пакет не работает.Пакет завершается с ошибкой в ​​первом операторе 'or'

, которое я получаю из отчетов о выполнении:

"неправильный синтаксис рядом с оператором" или "".

Оцененное значение (правильный запрос sql) прекрасно работает при выполнении в ssms.Я пытался разместить пустую строку до или после оператора 'or', но не решил проблему.Я пытался заменить оператор 'or' на 'and', не сработало.Выполненные без оператора 'where', пакеты работают как положено.В другом пакете я не смог продублировать ошибку

"  select * from src where id >= "+ @[User::MaxIdStr] +" or id >= "+  @[User::MaxIdStr]

Кусок кода, в котором ошибка выглядит так:

where
[DateUpdated (CCUPMJ)] >= "+ @[User::Max_Upmj_Start]  +" 
or F0911.[DateUpdated (GLUPMJ)] >= "  +  @[User::Max_Upmj_Start]+"
or F560911T.[DateUpdated (GLUPMJ)] >= "+ @[User::Max_Upmj_Start]

В VS это оценивается как:

[DateUpdated (CCUPMJ)] >= 119121 

or F0911.[DateUpdated (GLUPMJ)] >= 119121

or F560911T.[DateUpdated (GLUPMJ)] >= 119121

(значение переменной по умолчанию - 119121)

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

Если кто-то знает, какрешить это я буду очень грациозно!

1 Ответ

2 голосов
/ 07 мая 2019

Назначается ли @[User::Max_Upmj_Start] пустая строка или ноль во время выполнения пакета?Используя пустую строковую переменную, я смог воспроизвести тот же «неправильный синтаксис рядом с оператором» или «», которую вы получили.Поскольку 119121 является значением по умолчанию, вы можете использовать инструкцию SSIS IF, чтобы проверить длину переменной, и заменить 119121, если значение отсутствует.Функция LEN проверяет это ниже и использует значение по умолчанию, если длина @[User::Max_Upmj_Start] меньше 1. Для пояснения, синтаксис IF отображается прямо над примером выражения для этой переменной.Так как он вложен, каждый оператор IF заключен в круглые скобки.Я предполагаю, что вы пропустили начало переменной с полным оператором SELECT, поэтому в этом примере просто используется фиктивная SELECT * FROM ... в качестве заполнителя.Даже если он содержит число, из вашего выражения кажется, что @[User::Max_Upmj_Start] является строковой переменной, и приведенный ниже пример следует этому предположению.Имейте в виду, что переменные SSIS не содержат ноль, и для строковой переменной вместо этого будет подставлена ​​пустая строка, поэтому использование функции REPLACENULL здесь не поможет.

Синтаксис IF:

Expression ? True Condition : False Condition

Выражение переменной:

"SELECT * FROM ... WHERE
[DateUpdated (CCUPMJ)] >= " + 
(LEN(@[User::Max_Upmj_Start]) < 1 ? "119121" : @[User::Max_Upmj_Start]) 
+ "OR F0911.[DateUpdated (GLUPMJ)] >=  " + 
(LEN(@[User::Max_Upmj_Start]) < 1 ? "119121" : @[User::Max_Upmj_Start])+ "
OR F560911T.[DateUpdated (GLUPMJ)]  >=  " + 
(LEN(@[User::Max_Upmj_Start]) < 1 ? "119121" : @[User::Max_Upmj_Start])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...