#variables #ssis #expression #foreach-loop-container #execute-sql-task
#переменные #ssis #выражение #foreach-цикл-контейнер #execute-sql-task
Вопрос:
Я работаю над пакетом SSIS, который отклоняет уже загруженные файлы и загружает только новые файлы в таблицу. Я использовал for each loop и exceute SSQLДЛЯ проверки, если файлы уже загружены. Когда я оцениваю выражение Execute SQL Task, оно вычисляется нормально. Но когда я запускаю пакет, я получаю следующую ошибку.
Ошибка [Выполнить задачу SQL]: выполнение запроса «ОБЪЯВИТЬ @FileName VARCHAR(100) SET @FileName=Custo …» завершилось неудачно со следующей ошибкой: «Неправильный синтаксис рядом».». Возможные причины сбоя: проблемы с запросом, неверно заданное свойство «ResultSet», неверно заданные параметры, или соединение установлено неправильно.
Выражение, которое я использовал в задаче Execute SQL, является :
«ОБЪЯВИТЕ @FileName VARCHAR(100) УСТАНОВИТЕ @FileName=» @[User::FileName] «‘ ЕСЛИ СУЩЕСТВУЕТ (ВЫБЕРИТЕ 1 ИЗ [dbo] .[FileLoadStatus] ГДЕ filename =@FileName) BEGIN ВЫБЕРИТЕ 1 КАК FileExistsFlg END ELSE BEGIN Выберите 0 КАК FileExistsFlg END»
снимок экрана задачи execute SQL
Я действительно ценю, можете ли вы сказать, в чем проблема?
Комментарии:
1. Я вижу двойную пару запятых «» после @[User::FileName] … Я думаю, что это должно быть только одно »
Ответ №1:
Вы могли бы немного упростить свое выражение, чтобы прояснить, где используется переменная SSIS:
"SELECT COUNT(*) AS FileExistsFlg
FROM (
SELECT TOP(1) *
FROM
dbo.FileLoadStatus
WHERE
[filename] = '" @[User::FileName] "'
) x;"
С другой стороны, для задачи SQL вы могли бы использовать стандартный параметризованный запрос. Предполагая, что вы используете OLEDB-соединение, заполнителем параметра является ? знак. Выражение не требуется, и эквивалентный прямой ввод для задачи:
SELECT COUNT(*) AS FileExistsFlg
FROM (
SELECT TOP(1) *
FROM
dbo.FileLoadStatus
WHERE
[filename] = ?
) x;
С OLEDB вы должны сопоставить свою переменную с заполнителем по позиции (на основе нуля), поэтому в этом случае имя параметра равно нулевому числу. Другие свойства зависят от ваших метаданных и соответствуют переменной, которую вы должны объявить в SQL…
Это менее подвержено ошибкам, более понятно и повторно используется для нескольких вызовов, поскольку генерирует подготовленный оператор.
Если ваш тип подключения был ADO.Net , отображение основано на имени. Поэтому проверьте документацию на наличие имен параметров и маркеров для каждого типа соединения.